)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"a67c37e05e094c2e4359c1d1d22bb84948c6a2a4","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-07-09 11:01:09 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Enhance PCI passthrough whitelist to support regex"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements: blueprint pci-passthrough-whitelist-regex"},{"line_number":10,"context_line":"DocImpact"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a50d1a3_7ed4c2e7","line":8,"updated":"2015-07-29 16:14:30.000000000","message":"Can you clearly document the new nova.conf syntax in this commit message, as its not entirely obvious from the code what the new syntax looks like.","commit_id":"326385f193a452a8bba9cdfd6c393bfe9c3bdcbe"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"0468b833c386cf02c8e25259025c3c8eddc6f2b0","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-07-09 11:01:09 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Enhance PCI passthrough whitelist to support regex"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements: blueprint pci-passthrough-whitelist-regex"},{"line_number":10,"context_line":"DocImpact"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a50d1a3_18c808a8","line":8,"in_reply_to":"3a50d1a3_7ed4c2e7","updated":"2015-07-30 11:27:03.000000000","message":"Done","commit_id":"326385f193a452a8bba9cdfd6c393bfe9c3bdcbe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a8a60a23a680f71ee9ea0dd694061168f0d3da66","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Enhance PCI passthrough whitelist to support regex"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch introduce a new syntax for the address key:"},{"line_number":10,"context_line":"    \"address\":{ \"domain\": \u003cregex_domain\u003e, \"bus\": \u003cregex_bus\u003e,"},{"line_number":11,"context_line":"\t\t\"slot\": \u003cregex_slot\u003e, \"function\": \u003cregex_function\u003e }"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1aa78d24_284e2996","line":9,"updated":"2016-07-05 18:19:22.000000000","message":"s/introduce/introduces/","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"0feb539fabc627a45707b8d0079bc2868db6ec42","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Enhance PCI passthrough whitelist to support regex"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch introduce a new syntax for the address key:"},{"line_number":10,"context_line":"    \"address\":{ \"domain\": \u003cregex_domain\u003e, \"bus\": \u003cregex_bus\u003e,"},{"line_number":11,"context_line":"\t\t\"slot\": \u003cregex_slot\u003e, \"function\": \u003cregex_function\u003e }"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1aa78d24_c16f7629","line":9,"in_reply_to":"1aa78d24_284e2996","updated":"2016-07-06 00:09:26.000000000","message":"Done","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"64b96fbbbaa6a7c070203310a82d4d3b84d7c905","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch introduce a new syntax for the address key:"},{"line_number":10,"context_line":"    \"address\":{ \"domain\": \u003cregex_domain\u003e, \"bus\": \u003cregex_bus\u003e,"},{"line_number":11,"context_line":"\t\t\"slot\": \u003cregex_slot\u003e, \"function\": \u003cregex_function\u003e }"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Example for the regular expression syntax:"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1aa78d24_7575af96","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":2},"updated":"2016-07-05 16:14:30.000000000","message":"nit: Don\u0027t use hard tabs here","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"0feb539fabc627a45707b8d0079bc2868db6ec42","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch introduce a new syntax for the address key:"},{"line_number":10,"context_line":"    \"address\":{ \"domain\": \u003cregex_domain\u003e, \"bus\": \u003cregex_bus\u003e,"},{"line_number":11,"context_line":"\t\t\"slot\": \u003cregex_slot\u003e, \"function\": \u003cregex_function\u003e }"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Example for the regular expression syntax:"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1aa78d24_482d7545","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":2},"in_reply_to":"1aa78d24_7575af96","updated":"2016-07-06 00:09:26.000000000","message":"Done","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6fc3285f92195ada1b84d418033cd0e4e0e7f91a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                                \"physical_network\":\"net1\"}"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Implements: blueprint pci-passthrough-whitelist-regex"},{"line_number":28,"context_line":"DocImpact"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Change-Id: I9a110fb7907415a542d992d98ca7956148d2cbd9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1aa78d24_ba8424d4","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":9},"updated":"2016-07-05 16:02:02.000000000","message":"What is the doc impact specifically? This will generate a nova bug so we should know what needs updating - are there existing manuals for this that need updating, or something in the nova devref? Because if it\u0027s the latter, it should just happen in this change.","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6cf9dab612b33459821ec99490fdd9c32699a5d1","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                                \"physical_network\":\"net1\"}"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Implements: blueprint pci-passthrough-whitelist-regex"},{"line_number":28,"context_line":"DocImpact"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Change-Id: I9a110fb7907415a542d992d98ca7956148d2cbd9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1aa78d24_f91cf9c2","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":9},"in_reply_to":"1aa78d24_15c54b5a","updated":"2016-07-05 16:37:11.000000000","message":"+1 on updating the nova/conf description.","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"64b96fbbbaa6a7c070203310a82d4d3b84d7c905","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                                \"physical_network\":\"net1\"}"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Implements: blueprint pci-passthrough-whitelist-regex"},{"line_number":28,"context_line":"DocImpact"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Change-Id: I9a110fb7907415a542d992d98ca7956148d2cbd9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1aa78d24_15c54b5a","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":9},"in_reply_to":"1aa78d24_9aecc890","updated":"2016-07-05 16:14:30.000000000","message":"\u003e I\u0027m assuming this needs updating: http://git.openstack.org/cgit/openstack/openstack-manuals/tree/doc/networking-guide/source/adv-config-sriov.rst#n196\n\nI don\u0027t think that docs needs to be updated. However, the \u0027pci_passthrough_whitelist\u0027 Opt in \u0027nova/conf\u0027 should be updated as that would allow this tag to be removed.","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d3f9d04d5ee665db626fb52f6435f0623dccd4ac","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                                \"physical_network\":\"net1\"}"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Implements: blueprint pci-passthrough-whitelist-regex"},{"line_number":28,"context_line":"DocImpact"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Change-Id: I9a110fb7907415a542d992d98ca7956148d2cbd9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1aa78d24_9aecc890","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":9},"in_reply_to":"1aa78d24_ba8424d4","updated":"2016-07-05 16:03:41.000000000","message":"I\u0027m assuming this needs updating:\n\nhttp://git.openstack.org/cgit/openstack/openstack-manuals/tree/doc/networking-guide/source/adv-config-sriov.rst#n196","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"0feb539fabc627a45707b8d0079bc2868db6ec42","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                                \"physical_network\":\"net1\"}"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Implements: blueprint pci-passthrough-whitelist-regex"},{"line_number":28,"context_line":"DocImpact"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Change-Id: I9a110fb7907415a542d992d98ca7956148d2cbd9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1aa78d24_c821654f","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":9},"in_reply_to":"1aa78d24_f91cf9c2","updated":"2016-07-06 00:09:26.000000000","message":"Done","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"}],"nova/conf/pci.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"136e6a6153a2c8dd244ab4bc3a239f7d991ed181","unresolved":false,"context_lines":[{"line_number":72,"context_line":"  the following format:"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    [\"device_id\": \"\u003cid\u003e\",] [\"product_id\": \"\u003cid\u003e\",]"},{"line_number":75,"context_line":"    [\"address\": \"[[[[\u003cdomain\u003e]:]\u003cbus\u003e]:][\u003cslot\u003e][.[\u003cfunction\u003e]]\" |"},{"line_number":76,"context_line":"     \"devname\": \"PCI Device Name\",]"},{"line_number":77,"context_line":"    {\"tag\": \"\u003ctag_value\u003e\",}"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_5ed29d35","line":75,"range":{"start_line":75,"start_character":16,"end_line":75,"end_character":64},"updated":"2016-07-08 13:36:16.000000000","message":"Sorry, just spotted, this comment is no longer valid.\n\nWe should probably just document the two alternative formats, rather than try describe it in one go.","commit_id":"2c02cccfe13e1d384d1552a531ff9b8ef56556d7"},{"author":{"_account_id":14511,"name":"Maciej Szankin","email":"maciej+review@szankin.pl","username":"mszankin"},"change_message_id":"55dc5c0f3d3020ba6d37d358cda5030b70bba32e","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                                        \"bus\": \"02\", \"slot\": \"01\","},{"line_number":101,"context_line":"                                        \"function\": \"[2-7]\"},"},{"line_number":102,"context_line":"                             \"physical_network\":\"physnet1\"}"},{"line_number":103,"context_line":"    passthrough_whitelist\u003d {\"address\":{\"domain\": \".*\","},{"line_number":104,"context_line":"                                       \"bus\": \"02\", \"slot\": \"0[1-2]\","},{"line_number":105,"context_line":"                                       \"function\": \".*\"},"},{"line_number":106,"context_line":"                            \"physical_network\":\"physnet1\"}"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a77a97e_9d496eba","line":103,"range":{"start_line":103,"start_character":25,"end_line":103,"end_character":26},"updated":"2016-11-22 20:04:07.000000000","message":"Nit: missing space","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"4ee819b6c69d64e07ac86481176348a1b428974c","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                                        \"bus\": \"02\", \"slot\": \"01\","},{"line_number":101,"context_line":"                                        \"function\": \"[2-7]\"},"},{"line_number":102,"context_line":"                             \"physical_network\":\"physnet1\"}"},{"line_number":103,"context_line":"    passthrough_whitelist\u003d {\"address\":{\"domain\": \".*\","},{"line_number":104,"context_line":"                                       \"bus\": \"02\", \"slot\": \"0[1-2]\","},{"line_number":105,"context_line":"                                       \"function\": \".*\"},"},{"line_number":106,"context_line":"                            \"physical_network\":\"physnet1\"}"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_971d1fc0","line":103,"range":{"start_line":103,"start_character":25,"end_line":103,"end_character":26},"in_reply_to":"7a77a97e_9d496eba","updated":"2016-11-23 07:57:12.000000000","message":"Done","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"}],"nova/pci/devspec.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"a67c37e05e094c2e4359c1d1d22bb84948c6a2a4","unresolved":false,"context_lines":[{"line_number":222,"context_line":""},{"line_number":223,"context_line":"            self._check_physical_function()"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        if self.is_physical_function:"},{"line_number":226,"context_line":"            self.pci_address_spec \u003d PciAddress(pci_addr_spec)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def match(self, pci_addr, pci_phys_addr):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_3e3cfa91","line":225,"updated":"2015-07-29 16:14:30.000000000","message":"Nitpick, this could simply be \u0027else:\u0027 can\u0027t it, since the previous \u0027if\u0027 is testing the inverse ?","commit_id":"326385f193a452a8bba9cdfd6c393bfe9c3bdcbe"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"0468b833c386cf02c8e25259025c3c8eddc6f2b0","unresolved":false,"context_lines":[{"line_number":222,"context_line":""},{"line_number":223,"context_line":"            self._check_physical_function()"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        if self.is_physical_function:"},{"line_number":226,"context_line":"            self.pci_address_spec \u003d PciAddress(pci_addr_spec)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def match(self, pci_addr, pci_phys_addr):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_f8d8bc81","line":225,"in_reply_to":"3a50d1a3_3e3cfa91","updated":"2015-07-30 11:27:03.000000000","message":"Done","commit_id":"326385f193a452a8bba9cdfd6c393bfe9c3bdcbe"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"47e56fd68aca2364fd8d40c5809baa5a7d5829ab","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    their regex."},{"line_number":160,"context_line":"    \"\"\""},{"line_number":161,"context_line":"    def __init__(self, pci_addr_spec):"},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            self.domain \u003d pci_addr_spec[\u0027domain\u0027]"},{"line_number":164,"context_line":"            self.bus \u003d pci_addr_spec[\u0027bus\u0027]"},{"line_number":165,"context_line":"            self.slot \u003d pci_addr_spec[\u0027slot\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_8b2da4aa","line":162,"updated":"2015-07-30 12:02:15.000000000","message":"Do we really need to have all of the elements set, we should consider to .*\u0027s wildcard elements not defined.\n\n  address: {\"slot\": 00, \"function\": [1-3]}","commit_id":"574e048212499a742dfc85338bc1262020e09eb2"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"9b6eb8f2be297bcab2f96606868bc889a4a24d7f","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    their regex."},{"line_number":160,"context_line":"    \"\"\""},{"line_number":161,"context_line":"    def __init__(self, pci_addr_spec):"},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            self.domain \u003d pci_addr_spec[\u0027domain\u0027]"},{"line_number":164,"context_line":"            self.bus \u003d pci_addr_spec[\u0027bus\u0027]"},{"line_number":165,"context_line":"            self.slot \u003d pci_addr_spec[\u0027slot\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_3f936602","line":162,"in_reply_to":"3a50d1a3_6402c50b","updated":"2015-07-30 13:09:31.000000000","message":"Done","commit_id":"574e048212499a742dfc85338bc1262020e09eb2"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"3a64040c6ddecf228818bb4d5ac4f8947d90d49c","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    their regex."},{"line_number":160,"context_line":"    \"\"\""},{"line_number":161,"context_line":"    def __init__(self, pci_addr_spec):"},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            self.domain \u003d pci_addr_spec[\u0027domain\u0027]"},{"line_number":164,"context_line":"            self.bus \u003d pci_addr_spec[\u0027bus\u0027]"},{"line_number":165,"context_line":"            self.slot \u003d pci_addr_spec[\u0027slot\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_6402c50b","line":162,"in_reply_to":"3a50d1a3_8b2da4aa","updated":"2015-07-30 12:37:35.000000000","message":"no problem, I will update the code to support it.","commit_id":"574e048212499a742dfc85338bc1262020e09eb2"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"e981bce717cc3da11e3efe323df51f8d7a6141d6","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            if len(dbs_fields) \u003e 3:"},{"line_number":132,"context_line":"                raise exception.PciDeviceWrongAddressFormat("},{"line_number":133,"context_line":"                    address\u003dpci_addr_spec)"},{"line_number":134,"context_line":"            # If we got a partial address like \":00.\", we need to to turn this"},{"line_number":135,"context_line":"            # into a domain of ANY, a bus of ANY, and a slot of 00. This code"},{"line_number":136,"context_line":"            # allows the address bus and/or domain to be left off"},{"line_number":137,"context_line":"            dbs_all \u003d [ANY] * (3 - len(dbs_fields))"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_0a50a05d","line":134,"updated":"2015-07-30 16:59:32.000000000","message":"nit: s/to to/to","commit_id":"5c6f6f964df1b2a546349976e0cc471b8ad0ebab"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"368bf2f9e128c1fa42b16916e4588f4fbf07a40b","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            if len(dbs_fields) \u003e 3:"},{"line_number":132,"context_line":"                raise exception.PciDeviceWrongAddressFormat("},{"line_number":133,"context_line":"                    address\u003dpci_addr_spec)"},{"line_number":134,"context_line":"            # If we got a partial address like \":00.\", we need to to turn this"},{"line_number":135,"context_line":"            # into a domain of ANY, a bus of ANY, and a slot of 00. This code"},{"line_number":136,"context_line":"            # allows the address bus and/or domain to be left off"},{"line_number":137,"context_line":"            dbs_all \u003d [ANY] * (3 - len(dbs_fields))"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_fab5e9ec","line":134,"in_reply_to":"3a50d1a3_0a50a05d","updated":"2015-07-31 06:45:10.000000000","message":"Done","commit_id":"5c6f6f964df1b2a546349976e0cc471b8ad0ebab"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"e981bce717cc3da11e3efe323df51f8d7a6141d6","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        | pci_passthrough_whitelist \u003d {\"address\":\"*:0a:00.*\","},{"line_number":193,"context_line":"        |                         \"physical_network\":\"physnet1\"}"},{"line_number":194,"context_line":"        | pci_passthrough_whitelist \u003d {\"address\":\"*:0a:00.*\","},{"line_number":195,"context_line":"        |                         \"physical_network\":\"physnet1\"}"},{"line_number":196,"context_line":"        | pci_passthrough_whitelist\u003d {\"address\": {\"domain\": \".*\","},{"line_number":197,"context_line":"                                                  \"bus\": \"02\","},{"line_number":198,"context_line":"                                                  \"slot\": \"01\","}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_fd0e5c31","line":195,"updated":"2015-07-30 16:59:32.000000000","message":"the above two are identical. Please remove one","commit_id":"5c6f6f964df1b2a546349976e0cc471b8ad0ebab"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"368bf2f9e128c1fa42b16916e4588f4fbf07a40b","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        | pci_passthrough_whitelist \u003d {\"address\":\"*:0a:00.*\","},{"line_number":193,"context_line":"        |                         \"physical_network\":\"physnet1\"}"},{"line_number":194,"context_line":"        | pci_passthrough_whitelist \u003d {\"address\":\"*:0a:00.*\","},{"line_number":195,"context_line":"        |                         \"physical_network\":\"physnet1\"}"},{"line_number":196,"context_line":"        | pci_passthrough_whitelist\u003d {\"address\": {\"domain\": \".*\","},{"line_number":197,"context_line":"                                                  \"bus\": \"02\","},{"line_number":198,"context_line":"                                                  \"slot\": \"01\","}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_bac8c176","line":195,"in_reply_to":"3a50d1a3_fd0e5c31","updated":"2015-07-31 06:45:10.000000000","message":"Done","commit_id":"5c6f6f964df1b2a546349976e0cc471b8ad0ebab"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"8ed0c37125bbafdc8032d249fc4b6b26df8b0f95","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        return all(conditions)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class PciAddressGlobeSpec(PciAddressSpec):"},{"line_number":103,"context_line":"    \"\"\"Manages the address fields with globe style."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    This function class will validate the address fields with globe style,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a1a9d01_160ee0e4","line":102,"updated":"2015-09-30 15:02:19.000000000","message":"Should this say \"PciAddressGlobSpec\"?  (not globe)","commit_id":"fe2aff4df1801221945a88dca8c0c6bbf3360285"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"ae64683b6ccd0c4e5a18619a8c05d9af59d65c26","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        return all(conditions)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class PciAddressGlobeSpec(PciAddressSpec):"},{"line_number":103,"context_line":"    \"\"\"Manages the address fields with globe style."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    This function class will validate the address fields with globe style,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a1a9d01_1eda72e8","line":102,"in_reply_to":"9a1a9d01_160ee0e4","updated":"2015-09-30 16:33:35.000000000","message":"Done","commit_id":"fe2aff4df1801221945a88dca8c0c6bbf3360285"},{"author":{"_account_id":17973,"name":"Ludovic Beliveau","email":"lbeliveau@gmail.com","username":"lbeliveau"},"change_message_id":"5407a3bd3bcd5091336a10cec51326b0ec11a349","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    This class define the API for PCI address spec styles"},{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @abc.abstractmethod"},{"line_number":57,"context_line":"    def match(self):"},{"line_number":58,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_0126fa14","line":55,"updated":"2015-11-10 19:38:06.000000000","message":"Consider defining domain, bus, slot and func as abstract properties for more robustness.\n\nSee http://stackoverflow.com/questions/2736255/abstract-attributes-in-python","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"86dd5d0eaf9cf2cd8c3c430e5262a8ca581fc80e","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    This class define the API for PCI address spec styles"},{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @abc.abstractmethod"},{"line_number":57,"context_line":"    def match(self):"},{"line_number":58,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_1c0e0be5","line":55,"in_reply_to":"da85f559_0126fa14","updated":"2015-11-17 15:07:26.000000000","message":"Can you explain the benefit of doing so?\nSo I tried to add @abc.abstractmethod but then I needed to implement a getter and a setter for both all classes which seem like overkill.","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":17973,"name":"Ludovic Beliveau","email":"lbeliveau@gmail.com","username":"lbeliveau"},"change_message_id":"5407a3bd3bcd5091336a10cec51326b0ec11a349","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            all(c in string.hexdigits for c in self.slot),"},{"line_number":65,"context_line":"            all(c in string.hexdigits for c in self.func),"},{"line_number":66,"context_line":"        ]"},{"line_number":67,"context_line":"        return all(conditions)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class PciAddress(PciAddressSpec):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_819c2a10","line":67,"updated":"2015-11-10 19:38:06.000000000","message":"Nitpick: I would prefer to put both these lines into a single statement, but it\u0027s a question of style ...","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"86dd5d0eaf9cf2cd8c3c430e5262a8ca581fc80e","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            all(c in string.hexdigits for c in self.slot),"},{"line_number":65,"context_line":"            all(c in string.hexdigits for c in self.func),"},{"line_number":66,"context_line":"        ]"},{"line_number":67,"context_line":"        return all(conditions)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class PciAddress(PciAddressSpec):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_e1612006","line":67,"in_reply_to":"da85f559_819c2a10","updated":"2015-11-17 15:07:26.000000000","message":"Done","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":17973,"name":"Ludovic Beliveau","email":"lbeliveau@gmail.com","username":"lbeliveau"},"change_message_id":"5407a3bd3bcd5091336a10cec51326b0ec11a349","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class PciAddress(PciAddressSpec):"},{"line_number":71,"context_line":"    \"\"\"Manages the address fields which is single PCI address."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    This function class will validate the address fields for single PCI."},{"line_number":74,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_246c6ccf","line":71,"updated":"2015-11-10 19:38:06.000000000","message":"s/single/fully qualified/","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"86dd5d0eaf9cf2cd8c3c430e5262a8ca581fc80e","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class PciAddress(PciAddressSpec):"},{"line_number":71,"context_line":"    \"\"\"Manages the address fields which is single PCI address."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    This function class will validate the address fields for single PCI."},{"line_number":74,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_41a10c45","line":71,"in_reply_to":"da85f559_246c6ccf","updated":"2015-11-17 15:07:26.000000000","message":"Done","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":17973,"name":"Ludovic Beliveau","email":"lbeliveau@gmail.com","username":"lbeliveau"},"change_message_id":"5407a3bd3bcd5091336a10cec51326b0ec11a349","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                self.func \u003d pci_addr[\u0027function\u0027]"},{"line_number":82,"context_line":"            else:"},{"line_number":83,"context_line":"                self.domain, self.bus, self.slot, self.func \u003d ("},{"line_number":84,"context_line":"                    utils.get_pci_address_fields(pci_addr))"},{"line_number":85,"context_line":"            get_pci_dev_info(self, \u0027func\u0027, MAX_FUNC, \u0027%1x\u0027)"},{"line_number":86,"context_line":"            get_pci_dev_info(self, \u0027domain\u0027, MAX_DOMAIN, \u0027%04x\u0027)"},{"line_number":87,"context_line":"            get_pci_dev_info(self, \u0027bus\u0027, MAX_BUS, \u0027%02x\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_c4b9e016","line":84,"updated":"2015-11-10 19:38:06.000000000","message":"I believe there is an extra (), utils.get_pci_address_fields already returns a tuple.","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"86dd5d0eaf9cf2cd8c3c430e5262a8ca581fc80e","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                self.func \u003d pci_addr[\u0027function\u0027]"},{"line_number":82,"context_line":"            else:"},{"line_number":83,"context_line":"                self.domain, self.bus, self.slot, self.func \u003d ("},{"line_number":84,"context_line":"                    utils.get_pci_address_fields(pci_addr))"},{"line_number":85,"context_line":"            get_pci_dev_info(self, \u0027func\u0027, MAX_FUNC, \u0027%1x\u0027)"},{"line_number":86,"context_line":"            get_pci_dev_info(self, \u0027domain\u0027, MAX_DOMAIN, \u0027%04x\u0027)"},{"line_number":87,"context_line":"            get_pci_dev_info(self, \u0027bus\u0027, MAX_BUS, \u0027%02x\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_dc7f2313","line":84,"in_reply_to":"da85f559_c4b9e016","updated":"2015-11-17 15:07:26.000000000","message":"yes but it return as a string and this convert it to hex also we want to validate that the pci address is valid one.","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":17973,"name":"Ludovic Beliveau","email":"lbeliveau@gmail.com","username":"lbeliveau"},"change_message_id":"5407a3bd3bcd5091336a10cec51326b0ec11a349","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        self.slot \u003d ANY"},{"line_number":113,"context_line":"        self.func \u003d ANY"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        dbs, _, func \u003d pci_addr_spec.partition(\u0027.\u0027)"},{"line_number":116,"context_line":"        if func:"},{"line_number":117,"context_line":"            fstr \u003d func.strip()"},{"line_number":118,"context_line":"            if fstr !\u003d ANY:"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_c4e00099","line":115,"updated":"2015-11-10 19:38:06.000000000","message":"s/_/sep/ for consistency with utils.get_pci_address_fields, it is also more self explanatory than _.","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"86dd5d0eaf9cf2cd8c3c430e5262a8ca581fc80e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        self.slot \u003d ANY"},{"line_number":113,"context_line":"        self.func \u003d ANY"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        dbs, _, func \u003d pci_addr_spec.partition(\u0027.\u0027)"},{"line_number":116,"context_line":"        if func:"},{"line_number":117,"context_line":"            fstr \u003d func.strip()"},{"line_number":118,"context_line":"            if fstr !\u003d ANY:"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_21d088c8","line":115,"in_reply_to":"da85f559_c4e00099","updated":"2015-11-17 15:07:26.000000000","message":"Done","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":17973,"name":"Ludovic Beliveau","email":"lbeliveau@gmail.com","username":"lbeliveau"},"change_message_id":"5407a3bd3bcd5091336a10cec51326b0ec11a349","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                if f \u003e MAX_FUNC:"},{"line_number":125,"context_line":"                    raise exception.PciDeviceInvalidAddressField("},{"line_number":126,"context_line":"                        address\u003dpci_addr_spec, field\u003d\"function\")"},{"line_number":127,"context_line":"                self.func \u003d \"%1x\" % f"},{"line_number":128,"context_line":"        if dbs:"},{"line_number":129,"context_line":"            dbs_fields \u003d dbs.split(\u0027:\u0027)"},{"line_number":130,"context_line":"            if len(dbs_fields) \u003e 3:"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_f574d068","line":127,"updated":"2015-11-10 19:38:06.000000000","message":"Can\u0027t we just that in order to simplify this block:\nself.func \u003d func.strip()\nget_pci_dev_info(self, \u0027func\u0027, MAX_FUNC, \u0027%1x\u0027)","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"86dd5d0eaf9cf2cd8c3c430e5262a8ca581fc80e","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                if f \u003e MAX_FUNC:"},{"line_number":125,"context_line":"                    raise exception.PciDeviceInvalidAddressField("},{"line_number":126,"context_line":"                        address\u003dpci_addr_spec, field\u003d\"function\")"},{"line_number":127,"context_line":"                self.func \u003d \"%1x\" % f"},{"line_number":128,"context_line":"        if dbs:"},{"line_number":129,"context_line":"            dbs_fields \u003d dbs.split(\u0027:\u0027)"},{"line_number":130,"context_line":"            if len(dbs_fields) \u003e 3:"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_1ce7ebac","line":127,"in_reply_to":"da85f559_f574d068","updated":"2015-11-17 15:07:26.000000000","message":"Done","commit_id":"e4478a3b5b3bf5bafaf338f4af60f414d5a7214e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"20900c357b073584fe45a980480cb452aacc7de5","unresolved":false,"context_lines":[{"line_number":31,"context_line":"REGEX_ANY \u003d \u0027.*\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def get_pci_dev_info(pci_obj, property, max, hex_value):"},{"line_number":35,"context_line":"    a \u003d getattr(pci_obj, property)"},{"line_number":36,"context_line":"    if a \u003d\u003d ANY:"},{"line_number":37,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_9c4fa76a","line":34,"range":{"start_line":34,"start_character":30,"end_line":34,"end_character":44},"updated":"2016-01-05 09:37:54.000000000","message":"side note: these are both keywords, right? They should be renamed at some point, if so (not here though)","commit_id":"5f48a23f962cd3f5e0667fa76fcd62e3e0e64fab"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"fc64123e5731eb78bd1013d671c83e5a605138dd","unresolved":false,"context_lines":[{"line_number":31,"context_line":"REGEX_ANY \u003d \u0027.*\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def get_pci_dev_info(pci_obj, property, max, hex_value):"},{"line_number":35,"context_line":"    a \u003d getattr(pci_obj, property)"},{"line_number":36,"context_line":"    if a \u003d\u003d ANY:"},{"line_number":37,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":10,"id":"da6ed579_50ddeb40","line":34,"range":{"start_line":34,"start_character":30,"end_line":34,"end_character":44},"in_reply_to":"fa69d971_9c4fa76a","updated":"2016-01-12 20:18:56.000000000","message":"yes, we shouldn\u0027t use keywords. I can fix it in different patch","commit_id":"5f48a23f962cd3f5e0667fa76fcd62e3e0e64fab"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"20900c357b073584fe45a980480cb452aacc7de5","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            self.bus \u003d pci_addr_spec.get(\u0027bus\u0027, REGEX_ANY)"},{"line_number":154,"context_line":"            self.slot \u003d pci_addr_spec.get(\u0027slot\u0027, REGEX_ANY)"},{"line_number":155,"context_line":"            self.func \u003d pci_addr_spec.get(\u0027function\u0027, REGEX_ANY)"},{"line_number":156,"context_line":"            self.domain_regex \u003d re.compile(self.domain)"},{"line_number":157,"context_line":"            self.bus_regex \u003d re.compile(self.bus)"},{"line_number":158,"context_line":"            self.slot_regex \u003d re.compile(self.slot)"},{"line_number":159,"context_line":"            self.func_regex \u003d re.compile(self.func)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_fc9a636d","line":156,"range":{"start_line":156,"start_character":32,"end_line":156,"end_character":55},"updated":"2016-01-05 09:37:54.000000000","message":"Can we assume that no user/operator will ever state anything dangerous here (accidentally or otherwise), such as a regex with a lot of backtracking [1]? If we cannot, are you sure it\u0027s safe to use the full regex \"grammar\" rather than a subset?\n\n[1] http://www.regular-expressions.info/catastrophic.html","commit_id":"5f48a23f962cd3f5e0667fa76fcd62e3e0e64fab"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cbcd51011eb2c0ca006773bc424a4ec089b105e5","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            self.bus \u003d pci_addr_spec.get(\u0027bus\u0027, REGEX_ANY)"},{"line_number":154,"context_line":"            self.slot \u003d pci_addr_spec.get(\u0027slot\u0027, REGEX_ANY)"},{"line_number":155,"context_line":"            self.func \u003d pci_addr_spec.get(\u0027function\u0027, REGEX_ANY)"},{"line_number":156,"context_line":"            self.domain_regex \u003d re.compile(self.domain)"},{"line_number":157,"context_line":"            self.bus_regex \u003d re.compile(self.bus)"},{"line_number":158,"context_line":"            self.slot_regex \u003d re.compile(self.slot)"},{"line_number":159,"context_line":"            self.func_regex \u003d re.compile(self.func)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da6ed579_ab168449","line":156,"range":{"start_line":156,"start_character":32,"end_line":156,"end_character":55},"in_reply_to":"da6ed579_30a15795","updated":"2016-01-15 14:43:49.000000000","message":"Agreed. Figured it was worth bringing up nonetheless, given the potential security issues.","commit_id":"5f48a23f962cd3f5e0667fa76fcd62e3e0e64fab"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"fc64123e5731eb78bd1013d671c83e5a605138dd","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            self.bus \u003d pci_addr_spec.get(\u0027bus\u0027, REGEX_ANY)"},{"line_number":154,"context_line":"            self.slot \u003d pci_addr_spec.get(\u0027slot\u0027, REGEX_ANY)"},{"line_number":155,"context_line":"            self.func \u003d pci_addr_spec.get(\u0027function\u0027, REGEX_ANY)"},{"line_number":156,"context_line":"            self.domain_regex \u003d re.compile(self.domain)"},{"line_number":157,"context_line":"            self.bus_regex \u003d re.compile(self.bus)"},{"line_number":158,"context_line":"            self.slot_regex \u003d re.compile(self.slot)"},{"line_number":159,"context_line":"            self.func_regex \u003d re.compile(self.func)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da6ed579_30a15795","line":156,"range":{"start_line":156,"start_character":32,"end_line":156,"end_character":55},"in_reply_to":"fa69d971_fc9a636d","updated":"2016-01-12 20:18:56.000000000","message":"this comment is more regarding to the blueprint than code.\nSo my first suggestion in the bp was to add range syntax, but than it got change to regex. see https://review.openstack.org/#/c/145035/ and https://review.openstack.org/#/c/179577/","commit_id":"5f48a23f962cd3f5e0667fa76fcd62e3e0e64fab"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"54dffb6d7d2f2a220feda93ef80d4d58ea616dd3","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        v \u003d ast.literal_eval(\"0x\" + a)"},{"line_number":41,"context_line":"    except SyntaxError:"},{"line_number":42,"context_line":"        raise exception.PciConfigInvalidWhitelist("},{"line_number":43,"context_line":"            reason \u003d \"invalid %s %s\" % (property, a))"},{"line_number":44,"context_line":"    if v \u003e max:"},{"line_number":45,"context_line":"        raise exception.PciConfigInvalidWhitelist("},{"line_number":46,"context_line":"            reason\u003d_(\"invalid %(property)s %(attr)s\") %"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_fa26accc","line":43,"updated":"2016-07-05 18:29:56.000000000","message":"I know this was existing code, but is this any different than this much more conventional code:\n\n try:\n     v \u003d int(a, 16)\n except ValueError:\n     # handle\n\n?\n\nThe above will also handle the presence or absence of 0x automatically.","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"0feb539fabc627a45707b8d0079bc2868db6ec42","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        v \u003d ast.literal_eval(\"0x\" + a)"},{"line_number":41,"context_line":"    except SyntaxError:"},{"line_number":42,"context_line":"        raise exception.PciConfigInvalidWhitelist("},{"line_number":43,"context_line":"            reason \u003d \"invalid %s %s\" % (property, a))"},{"line_number":44,"context_line":"    if v \u003e max:"},{"line_number":45,"context_line":"        raise exception.PciConfigInvalidWhitelist("},{"line_number":46,"context_line":"            reason\u003d_(\"invalid %(property)s %(attr)s\") %"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_41bee665","line":43,"in_reply_to":"1aa78d24_fa26accc","updated":"2016-07-06 00:09:26.000000000","message":"Done","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a8a60a23a680f71ee9ea0dd694061168f0d3da66","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":52,"context_line":"class PciAddressSpec(object):"},{"line_number":53,"context_line":"    \"\"\"Abstract class for all PCI address spec styles"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    This class define the API for PCI address spec styles"},{"line_number":56,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_88459d71","line":53,"updated":"2016-07-05 18:19:22.000000000","message":"The definition of a \"spec\" (specification) is kind of that there *aren\u0027t* multiple ways of doing the same thing. :) I would prefer actually to simplify the pci_passthrough_whitelist CONF option to just use regex expressions for all of the components and mark the configuration option\u0027s help text that regexes can be used for matching any of the fields. That would actually dramatically simplify the crazy parsing and ast.literal_eval() silliness that currently plagues the pci.devspec module.\n\nTheoretically, one could replace the entire module with around 15 lines, total, of code that simply compiles a regex for each component of the pci_passthrough_whitelist fields (address, vendor, product, etc) and create a matching functor that called re.match() on a supplied value.","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"cdbc093ee972ff016144f9e174e92296bdd715d7","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":52,"context_line":"class PciAddressSpec(object):"},{"line_number":53,"context_line":"    \"\"\"Abstract class for all PCI address spec styles"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    This class define the API for PCI address spec styles"},{"line_number":56,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_701f5c6c","line":53,"in_reply_to":"1aa78d24_24c12855","updated":"2016-07-06 08:59:04.000000000","message":"So I like Jay\u0027s idea here.\n\nBut we do have upgrade to worry about, so we need to tell folks we are deprecating the old style.\n\nLets ignore the spec for now. Some things are just much clearer when you see the code.","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"0feb539fabc627a45707b8d0079bc2868db6ec42","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":52,"context_line":"class PciAddressSpec(object):"},{"line_number":53,"context_line":"    \"\"\"Abstract class for all PCI address spec styles"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    This class define the API for PCI address spec styles"},{"line_number":56,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_24c12855","line":53,"in_reply_to":"1aa78d24_88459d71","updated":"2016-07-06 00:09:26.000000000","message":"@Jay,\nregarding the name class of the calls I can rename it to what ever you want :) \n\nDoing the change you want requires changing the approved spec (I think).","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"59aa81be6b5c6ccf75e773748e99c14a990adbfc","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":52,"context_line":"class PciAddressSpec(object):"},{"line_number":53,"context_line":"    \"\"\"Abstract class for all PCI address spec styles"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    This class define the API for PCI address spec styles"},{"line_number":56,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_ba983b79","line":53,"in_reply_to":"1aa78d24_88459d71","updated":"2016-07-07 09:47:07.000000000","message":"You can\u0027t simply modify the existing config option to support regex syntax. The existing config already supports glob syntax, and there\u0027s no way to support regex support and glob support at the same time, since you can\u0027t unambiguously distinguish which the user has used. We also can\u0027t simply drop glob support as that would break existing configs.  So we need to have both glob and regex support at the same time.\n\nThis is why the spec ended up describing adding a separate syntax regex support.","commit_id":"fde074ca9f2a11140b5561bfa934a5ad9d8ad558"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e9f9a32ffe3e84997afbb55dcfc53a449f663cd","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    \"\"\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @abc.abstractmethod"},{"line_number":58,"context_line":"    def match(self):"},{"line_number":59,"context_line":"        pass"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def is_single_address(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_e901153b","line":58,"updated":"2016-07-08 14:21:24.000000000","message":"This is odd, should not all the match functions have the same signature for this to make sense?","commit_id":"2c02cccfe13e1d384d1552a531ff9b8ef56556d7"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e9f9a32ffe3e84997afbb55dcfc53a449f663cd","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            all(c in string.hexdigits for c in self.func)])"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class PciAddress(PciAddressSpec):"},{"line_number":70,"context_line":"    \"\"\"Manages the address fields which is fully qualified PCI address."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    This function class will validate the address fields for single PCI."}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_c978992e","line":69,"updated":"2016-07-08 14:21:24.000000000","message":"Maybe this should be PhysicalPciAddress?","commit_id":"2c02cccfe13e1d384d1552a531ff9b8ef56556d7"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e9f9a32ffe3e84997afbb55dcfc53a449f663cd","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            else:"},{"line_number":82,"context_line":"                self.domain, self.bus, self.slot, self.func \u003d ("},{"line_number":83,"context_line":"                    utils.get_pci_address_fields(pci_addr))"},{"line_number":84,"context_line":"            get_pci_dev_info(self, \u0027func\u0027, MAX_FUNC, \u0027%1x\u0027)"},{"line_number":85,"context_line":"            get_pci_dev_info(self, \u0027domain\u0027, MAX_DOMAIN, \u0027%04x\u0027)"},{"line_number":86,"context_line":"            get_pci_dev_info(self, \u0027bus\u0027, MAX_BUS, \u0027%02x\u0027)"},{"line_number":87,"context_line":"            get_pci_dev_info(self, \u0027slot\u0027, MAX_SLOT, \u0027%02x\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_feeee9b2","line":84,"range":{"start_line":84,"start_character":12,"end_line":84,"end_character":28},"updated":"2016-07-08 14:21:24.000000000","message":"Nit: get seems the wrong name for this, but its old code.","commit_id":"2c02cccfe13e1d384d1552a531ff9b8ef56556d7"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e9f9a32ffe3e84997afbb55dcfc53a449f663cd","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        return all(conditions)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"class WhitelistPciAddress(object):"},{"line_number":175,"context_line":"    \"\"\"Manages the address fields of the whitelist."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    This class checks the address fields of the pci_passthrough_whitelist"}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_49678925","line":174,"updated":"2016-07-08 14:21:24.000000000","message":"So I think this class should die, and get replaced by a factory that supplies one of the above classes that all have the same method signature.","commit_id":"2c02cccfe13e1d384d1552a531ff9b8ef56556d7"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e9f9a32ffe3e84997afbb55dcfc53a449f663cd","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        get_pci_dev_info(self, \u0027vendor_id\u0027, MAX_VENDOR_ID, \u0027%04x\u0027)"},{"line_number":245,"context_line":"        get_pci_dev_info(self, \u0027product_id\u0027, MAX_PRODUCT_ID, \u0027%04x\u0027)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        pf \u003d False"},{"line_number":248,"context_line":"        if self.address and self.dev_name:"},{"line_number":249,"context_line":"            raise exception.PciDeviceInvalidDeviceName()"},{"line_number":250,"context_line":"        if not self.address:"},{"line_number":251,"context_line":"            if self.dev_name:"},{"line_number":252,"context_line":"                self.address, pf \u003d utils.get_function_by_ifname("},{"line_number":253,"context_line":"                    self.dev_name)"},{"line_number":254,"context_line":"                if not self.address:"},{"line_number":255,"context_line":"                    raise exception.PciDeviceNotFoundById(id\u003dself.dev_name)"},{"line_number":256,"context_line":"            else:"},{"line_number":257,"context_line":"                self.address \u003d \"*:*:*.*\""},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"        self.address \u003d WhitelistPciAddress(self.address, pf)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def match(self, dev_dict):"},{"line_number":262,"context_line":"        conditions \u003d ["}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_a425745d","line":259,"range":{"start_line":247,"start_character":8,"end_line":259,"end_character":60},"updated":"2016-07-08 14:21:24.000000000","message":"Why is self.address not just one of: PciAddressRegexSpec, PciAddressGlobSpec or PhysicalPciAddress, that is constructed by some factory function, like parse_address(self.address, pf)","commit_id":"2c02cccfe13e1d384d1552a531ff9b8ef56556d7"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e9f9a32ffe3e84997afbb55dcfc53a449f663cd","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        conditions \u003d ["},{"line_number":263,"context_line":"            self.vendor_id in (ANY, dev_dict[\u0027vendor_id\u0027]),"},{"line_number":264,"context_line":"            self.product_id in (ANY, dev_dict[\u0027product_id\u0027]),"},{"line_number":265,"context_line":"            self.address.match(PciAddress(dev_dict[\u0027address\u0027]),"},{"line_number":266,"context_line":"                dev_dict.get(\u0027parent_addr\u0027))"},{"line_number":267,"context_line":"            ]"},{"line_number":268,"context_line":"        return all(conditions)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_64cf0cb4","line":265,"updated":"2016-07-08 14:21:24.000000000","message":"Surely the match function should just take the raw address, and that should be accepted by all the different implementation classes?","commit_id":"2c02cccfe13e1d384d1552a531ff9b8ef56556d7"},{"author":{"_account_id":17973,"name":"Ludovic Beliveau","email":"lbeliveau@gmail.com","username":"lbeliveau"},"change_message_id":"777bbd5ba724da379ea854f6155023114db27b5a","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @abc.abstractmethod"},{"line_number":58,"context_line":"    def match(self, pci_addr):"},{"line_number":59,"context_line":"        pass"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def is_single_address(self):"},{"line_number":62,"context_line":"        return all(["}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_ced437bf","line":59,"updated":"2016-08-02 13:44:14.000000000","message":"Shouldn\u0027t the base class raise an exception ifmatch() is call on it ?  This shouldn\u0027t be valid, match() should be called within the context of one of the sub-classes.  Maybe NotImplementedError() ?","commit_id":"d3a550a6cc6a64ee9034ae6a7bae239eec2c9da5"},{"author":{"_account_id":21683,"name":"edan david","email":"edand@mellanox.com","username":"edand"},"change_message_id":"5187f39928dea5b0593d4a1b814b61a80b3e37de","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @abc.abstractmethod"},{"line_number":58,"context_line":"    def match(self, pci_addr):"},{"line_number":59,"context_line":"        pass"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def is_single_address(self):"},{"line_number":62,"context_line":"        return all(["}],"source_content_type":"text/x-python","patch_set":18,"id":"5a8bc5a2_a24174ab","line":59,"in_reply_to":"bacf61ea_ced437bf","updated":"2016-09-25 10:04:53.000000000","message":"I\u0027ve added a unit test for this case, the wrapper throws an exception on creation.","commit_id":"d3a550a6cc6a64ee9034ae6a7bae239eec2c9da5"},{"author":{"_account_id":14511,"name":"Maciej Szankin","email":"maciej+review@szankin.pl","username":"mszankin"},"change_message_id":"55dc5c0f3d3020ba6d37d358cda5030b70bba32e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"REGEX_ANY \u003d \u0027.*\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def get_pci_dev_info(pci_obj, property, max, hex_value):"},{"line_number":35,"context_line":"    a \u003d getattr(pci_obj, property)"},{"line_number":36,"context_line":"    if a \u003d\u003d ANY:"},{"line_number":37,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a77a97e_180c8c3a","line":34,"range":{"start_line":34,"start_character":30,"end_line":34,"end_character":38},"updated":"2016-11-22 20:04:07.000000000","message":"Unrelated to changes in this patch: is there any solid reason to use var name that shadows builtin property?","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"4ee819b6c69d64e07ac86481176348a1b428974c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"REGEX_ANY \u003d \u0027.*\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def get_pci_dev_info(pci_obj, property, max, hex_value):"},{"line_number":35,"context_line":"    a \u003d getattr(pci_obj, property)"},{"line_number":36,"context_line":"    if a \u003d\u003d ANY:"},{"line_number":37,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_974b5fb0","line":34,"range":{"start_line":34,"start_character":30,"end_line":34,"end_character":38},"in_reply_to":"7a77a97e_180c8c3a","updated":"2016-11-23 07:57:12.000000000","message":"I will fix that in different patch","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"21a7e792b61cfdb08b99da764f3b9fbe13cdd40c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        v \u003d int(a, 16)"},{"line_number":40,"context_line":"    except ValueError:"},{"line_number":41,"context_line":"        raise exception.PciConfigInvalidWhitelist("},{"line_number":42,"context_line":"            reason \u003d \"invalid %s %s\" % (property, a))"},{"line_number":43,"context_line":"    if v \u003e max:"},{"line_number":44,"context_line":"        raise exception.PciConfigInvalidWhitelist("},{"line_number":45,"context_line":"            reason\u003d_(\"invalid %(property)s %(attr)s\") %"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a77a97e_4591b898","line":42,"updated":"2016-11-22 21:30:39.000000000","message":"Technically, you could put the above change into a totally separate patch, since it\u0027s not integral to this one...","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"4ee819b6c69d64e07ac86481176348a1b428974c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        v \u003d int(a, 16)"},{"line_number":40,"context_line":"    except ValueError:"},{"line_number":41,"context_line":"        raise exception.PciConfigInvalidWhitelist("},{"line_number":42,"context_line":"            reason \u003d \"invalid %s %s\" % (property, a))"},{"line_number":43,"context_line":"    if v \u003e max:"},{"line_number":44,"context_line":"        raise exception.PciConfigInvalidWhitelist("},{"line_number":45,"context_line":"            reason\u003d_(\"invalid %(property)s %(attr)s\") %"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_d7cb171d","line":42,"in_reply_to":"7a77a97e_4591b898","updated":"2016-11-23 07:57:12.000000000","message":"yes I know but Dan Smith requested this change, also there are unit test which are depend on this change because we are error handling invalid attributes.","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"21a7e792b61cfdb08b99da764f3b9fbe13cdd40c","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class PhysicalPciAddress(PciAddressSpec):"},{"line_number":70,"context_line":"    \"\"\"Manages the address fields which is fully qualified PCI address."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    This function class will validate the address fields for single PCI."},{"line_number":73,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":25,"id":"7a77a97e_e55ba4f4","line":70,"updated":"2016-11-22 21:30:39.000000000","message":"s/which is fully /for a fully-/","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"4ee819b6c69d64e07ac86481176348a1b428974c","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class PhysicalPciAddress(PciAddressSpec):"},{"line_number":70,"context_line":"    \"\"\"Manages the address fields which is fully qualified PCI address."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    This function class will validate the address fields for single PCI."},{"line_number":73,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_57ff0734","line":70,"in_reply_to":"7a77a97e_e55ba4f4","updated":"2016-11-23 07:57:12.000000000","message":"Done","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"21a7e792b61cfdb08b99da764f3b9fbe13cdd40c","unresolved":false,"context_lines":[{"line_number":69,"context_line":"class PhysicalPciAddress(PciAddressSpec):"},{"line_number":70,"context_line":"    \"\"\"Manages the address fields which is fully qualified PCI address."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    This function class will validate the address fields for single PCI."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    def __init__(self, pci_addr):"},{"line_number":75,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a77a97e_855e70e7","line":72,"updated":"2016-11-22 21:30:39.000000000","message":"\"for single PCI\" is that an unmarried PCI?\n\nI think you meant \"for a single PCI device\" :)","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"4ee819b6c69d64e07ac86481176348a1b428974c","unresolved":false,"context_lines":[{"line_number":69,"context_line":"class PhysicalPciAddress(PciAddressSpec):"},{"line_number":70,"context_line":"    \"\"\"Manages the address fields which is fully qualified PCI address."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    This function class will validate the address fields for single PCI."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    def __init__(self, pci_addr):"},{"line_number":75,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_3789abcb","line":72,"in_reply_to":"7a77a97e_855e70e7","updated":"2016-11-23 07:57:12.000000000","message":"I will fix it :)","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":17973,"name":"Ludovic Beliveau","email":"lbeliveau@gmail.com","username":"lbeliveau"},"change_message_id":"366edaf3fd06a0a83f5eb7a2264de85a53d31383","unresolved":false,"context_lines":[{"line_number":246,"context_line":"    def _init_dev_details(self):"},{"line_number":247,"context_line":"        self.vendor_id \u003d self.tags.pop(\"vendor_id\", ANY)"},{"line_number":248,"context_line":"        self.product_id \u003d self.tags.pop(\"product_id\", ANY)"},{"line_number":249,"context_line":"        # Note(moshele): The address attribute can be string"},{"line_number":250,"context_line":"        # for glob syntax/specific pci or dictionary for regex syntax the"},{"line_number":251,"context_line":"        # WhitelistPciAddress handle both types"},{"line_number":252,"context_line":"        self.address \u003d self.tags.pop(\"address\", None)"}],"source_content_type":"text/x-python","patch_set":27,"id":"5a74a57a_0adbf04f","line":249,"range":{"start_line":249,"start_character":54,"end_line":249,"end_character":55},"updated":"2016-11-28 13:59:10.000000000","message":"s/can be string/can be a string/\n\nCan it be something else than a string ?  If not, say \"\"The address is a string.  If yes, specify what else it can be.","commit_id":"143ad6b653a4acd1bf01e392839f2e4f2d07e2b6"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"6574c3f8ea5d41c6c64ce2350290f1bbd8239be0","unresolved":false,"context_lines":[{"line_number":246,"context_line":"    def _init_dev_details(self):"},{"line_number":247,"context_line":"        self.vendor_id \u003d self.tags.pop(\"vendor_id\", ANY)"},{"line_number":248,"context_line":"        self.product_id \u003d self.tags.pop(\"product_id\", ANY)"},{"line_number":249,"context_line":"        # Note(moshele): The address attribute can be string"},{"line_number":250,"context_line":"        # for glob syntax/specific pci or dictionary for regex syntax the"},{"line_number":251,"context_line":"        # WhitelistPciAddress handle both types"},{"line_number":252,"context_line":"        self.address \u003d self.tags.pop(\"address\", None)"}],"source_content_type":"text/x-python","patch_set":27,"id":"5a74a57a_613ac69a","line":249,"range":{"start_line":249,"start_character":54,"end_line":249,"end_character":55},"in_reply_to":"5a74a57a_0adbf04f","updated":"2016-11-28 15:24:57.000000000","message":"Done","commit_id":"143ad6b653a4acd1bf01e392839f2e4f2d07e2b6"},{"author":{"_account_id":17973,"name":"Ludovic Beliveau","email":"lbeliveau@gmail.com","username":"lbeliveau"},"change_message_id":"366edaf3fd06a0a83f5eb7a2264de85a53d31383","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        self.vendor_id \u003d self.tags.pop(\"vendor_id\", ANY)"},{"line_number":248,"context_line":"        self.product_id \u003d self.tags.pop(\"product_id\", ANY)"},{"line_number":249,"context_line":"        # Note(moshele): The address attribute can be string"},{"line_number":250,"context_line":"        # for glob syntax/specific pci or dictionary for regex syntax the"},{"line_number":251,"context_line":"        # WhitelistPciAddress handle both types"},{"line_number":252,"context_line":"        self.address \u003d self.tags.pop(\"address\", None)"},{"line_number":253,"context_line":"        self.dev_name \u003d self.tags.pop(\"devname\", None)"}],"source_content_type":"text/x-python","patch_set":27,"id":"5a74a57a_2a38ac3c","line":250,"updated":"2016-11-28 13:59:10.000000000","message":"This phrase is too long, and I\u0027m not sure what is means.  You should split it into multiple phrases.","commit_id":"143ad6b653a4acd1bf01e392839f2e4f2d07e2b6"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"6574c3f8ea5d41c6c64ce2350290f1bbd8239be0","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        self.vendor_id \u003d self.tags.pop(\"vendor_id\", ANY)"},{"line_number":248,"context_line":"        self.product_id \u003d self.tags.pop(\"product_id\", ANY)"},{"line_number":249,"context_line":"        # Note(moshele): The address attribute can be string"},{"line_number":250,"context_line":"        # for glob syntax/specific pci or dictionary for regex syntax the"},{"line_number":251,"context_line":"        # WhitelistPciAddress handle both types"},{"line_number":252,"context_line":"        self.address \u003d self.tags.pop(\"address\", None)"},{"line_number":253,"context_line":"        self.dev_name \u003d self.tags.pop(\"devname\", None)"}],"source_content_type":"text/x-python","patch_set":27,"id":"5a74a57a_816442b9","line":250,"in_reply_to":"5a74a57a_2a38ac3c","updated":"2016-11-28 15:24:57.000000000","message":"Done","commit_id":"143ad6b653a4acd1bf01e392839f2e4f2d07e2b6"}],"nova/tests/unit/pci/test_devspec.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"cc876fa509fdf0ab3eddfc787481898faf6731b4","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        pci \u003d devspec.PciDeviceSpec(pci_info)"},{"line_number":177,"context_line":"        self.assertTrue(pci.match(dev))"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"class PciDevSpecTestCase(test.NoDBTestCase):"},{"line_number":181,"context_line":"    def test_spec_match(self):"},{"line_number":182,"context_line":"        pci_info \u003d {\"vendor_id\": \"8086\", \"address\": \"*: *: *.5\","}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_58863014","line":179,"updated":"2016-07-08 14:22:54.000000000","message":"I was expecting to see test classes for each of the subclasses in here, then slowly building things up from there.","commit_id":"2c02cccfe13e1d384d1552a531ff9b8ef56556d7"},{"author":{"_account_id":21683,"name":"edan david","email":"edand@mellanox.com","username":"edand"},"change_message_id":"2311cca942e8e7e561775abde72178cad08dbd21","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        pci \u003d devspec.PciDeviceSpec(pci_info)"},{"line_number":177,"context_line":"        self.assertTrue(pci.match(dev))"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"class PciDevSpecTestCase(test.NoDBTestCase):"},{"line_number":181,"context_line":"    def test_spec_match(self):"},{"line_number":182,"context_line":"        pci_info \u003d {\"vendor_id\": \"8086\", \"address\": \"*: *: *.5\","}],"source_content_type":"text/x-python","patch_set":17,"id":"5a8bc5a2_e247fcb9","line":179,"in_reply_to":"1aa78d24_58863014","updated":"2016-09-25 10:04:43.000000000","message":"Done","commit_id":"2c02cccfe13e1d384d1552a531ff9b8ef56556d7"},{"author":{"_account_id":17973,"name":"Ludovic Beliveau","email":"lbeliveau@gmail.com","username":"lbeliveau"},"change_message_id":"a647bcca1eafdaa12669dd7c0069c974b1ad3586","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        for address in addresses:"},{"line_number":143,"context_line":"            phys_addr2 \u003d devspec.PciAddressGlobSpec(address)"},{"line_number":144,"context_line":"            self.assertFalse(phys_addr1.match(phys_addr2))"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"class PciAddressTestCase(test.NoDBTestCase):"},{"line_number":148,"context_line":"    def test_wrong_address(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a629dbe_457ca920","line":145,"updated":"2016-11-07 14:04:36.000000000","message":"I think it would make sense to group the regex test in their own class, like you did for PhysicalPciAddressTestCase and PciAddressGlobSpecTestCase.","commit_id":"3e9f4a731317fd0aca05bd2d71be8e4c5d6c2f73"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"21a7e792b61cfdb08b99da764f3b9fbe13cdd40c","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"dev \u003d {\"vendor_id\": \"8086\","},{"line_number":24,"context_line":"       \"product_id\": \"5057\","},{"line_number":25,"context_line":"       \"address\": \"0000:0a:00.5\","},{"line_number":26,"context_line":"       \"parent_addr\": \"0000:0a:00.0\"}"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"7a77a97e_25f4bc85","line":25,"updated":"2016-11-22 21:30:39.000000000","message":"ok...","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"4ee819b6c69d64e07ac86481176348a1b428974c","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"dev \u003d {\"vendor_id\": \"8086\","},{"line_number":24,"context_line":"       \"product_id\": \"5057\","},{"line_number":25,"context_line":"       \"address\": \"0000:0a:00.5\","},{"line_number":26,"context_line":"       \"parent_addr\": \"0000:0a:00.0\"}"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_57ad4730","line":25,"in_reply_to":"7a77a97e_25f4bc85","updated":"2016-11-23 07:57:12.000000000","message":"just to make the test more realistic.\nthe parent_add and VF address should be on the same bus","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"21a7e792b61cfdb08b99da764f3b9fbe13cdd40c","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.assertEqual(phys_addr.slot, \"00\")"},{"line_number":71,"context_line":"        self.assertEqual(phys_addr.func, \"5\")"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def test_init_by_string_invlaid_values(self):"},{"line_number":74,"context_line":"        invalid_addresses \u003d [str(devspec.MAX_DOMAIN + 1) + \":0a:00.5\","},{"line_number":75,"context_line":"                            \"0000:\" + str(devspec.MAX_BUS + 1) + \":00.5\","},{"line_number":76,"context_line":"                            \"0000:0a:\" + str(devspec.MAX_SLOT + 1) + \".5\","}],"source_content_type":"text/x-python","patch_set":25,"id":"7a77a97e_a5f1ac6c","line":73,"updated":"2016-11-22 21:30:39.000000000","message":"s/invlaid/invalid/","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"4ee819b6c69d64e07ac86481176348a1b428974c","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.assertEqual(phys_addr.slot, \"00\")"},{"line_number":71,"context_line":"        self.assertEqual(phys_addr.func, \"5\")"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def test_init_by_string_invlaid_values(self):"},{"line_number":74,"context_line":"        invalid_addresses \u003d [str(devspec.MAX_DOMAIN + 1) + \":0a:00.5\","},{"line_number":75,"context_line":"                            \"0000:\" + str(devspec.MAX_BUS + 1) + \":00.5\","},{"line_number":76,"context_line":"                            \"0000:0a:\" + str(devspec.MAX_SLOT + 1) + \".5\","}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_b7621b15","line":73,"in_reply_to":"7a77a97e_a5f1ac6c","updated":"2016-11-23 07:57:12.000000000","message":"Done","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"21a7e792b61cfdb08b99da764f3b9fbe13cdd40c","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                      \"slot\": \"[0-3]\", \"function\": \".*\"}]"},{"line_number":191,"context_line":"        for address in addresses:"},{"line_number":192,"context_line":"            regex_addr \u003d devspec.PciAddressRegexSpec(address)"},{"line_number":193,"context_line":"            self.assertFalse(regex_addr.match(phys_addr))"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"class PciAddressTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_5562acd9","line":193,"updated":"2016-11-22 21:30:39.000000000","message":"Might be nice to add a unit test that shows what happens if the deployer uses a glob syntax (i.e. * instead of .*) in their pci_passthrough_whitelist conf value that is a dict instead of a string (and thus will trigger the regex subclass)","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"4ee819b6c69d64e07ac86481176348a1b428974c","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                      \"slot\": \"[0-3]\", \"function\": \".*\"}]"},{"line_number":191,"context_line":"        for address in addresses:"},{"line_number":192,"context_line":"            regex_addr \u003d devspec.PciAddressRegexSpec(address)"},{"line_number":193,"context_line":"            self.assertFalse(regex_addr.match(phys_addr))"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"class PciAddressTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_cdbb8474","line":193,"in_reply_to":"5a74a57a_5562acd9","updated":"2016-11-23 07:57:12.000000000","message":"yes, I add some tests to test_devspec.py to test that","commit_id":"f571136fcf05a068b2490bb24735c83b9f084caf"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d73af529531b486313ecfd5e9b6f4c9b2596863d","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                                },"},{"line_number":350,"context_line":"                    \"physical_network\": \"hr_net\"}"},{"line_number":351,"context_line":"        pci \u003d devspec.PciDeviceSpec(pci_info)"},{"line_number":352,"context_line":"        self.assertTrue(pci.match(dev))"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"class PciDevSpecTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a74a57a_00bc556b","line":352,"updated":"2016-11-23 13:01:41.000000000","message":"Can you point me to where you are testing the behaviour of a glob-style syntax parsed with the regex PCI matcher? I think that will be something that may be a common occurrence as we try to phase out support for glob syntax and standardize on regex support, so I\u0027d like to see it tested.","commit_id":"332c15664affaf37265fecb8eca923c7bf065403"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"6d18152ed8e198da8e41a47dd6d3d1bda87ccd77","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                                },"},{"line_number":350,"context_line":"                    \"physical_network\": \"hr_net\"}"},{"line_number":351,"context_line":"        pci \u003d devspec.PciDeviceSpec(pci_info)"},{"line_number":352,"context_line":"        self.assertTrue(pci.match(dev))"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"class PciDevSpecTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a74a57a_ec63ab18","line":352,"in_reply_to":"5a74a57a_00bc556b","updated":"2016-11-24 06:37:39.000000000","message":"So the current code create a matcher based on the pci whitelist syntax. if address is string (e.g \"0000:0a:*.4\") it will grate a globe matcher and if it dict (e.g \"{\"domain\": \"0000\", \"bus\": \"0a\", \"slot\": \"00\", \"function\": \"0\"}\" it will create a regx matcher.\nif I understand you comment you want me to keep on the regex match and translate the glob syntax to regex and than pass it to the matcher. Did I understand you comment correctly?","commit_id":"332c15664affaf37265fecb8eca923c7bf065403"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"f6f6a5157bb0faf10e69f0937ea8c27baa797003","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                                },"},{"line_number":350,"context_line":"                    \"physical_network\": \"hr_net\"}"},{"line_number":351,"context_line":"        pci \u003d devspec.PciDeviceSpec(pci_info)"},{"line_number":352,"context_line":"        self.assertTrue(pci.match(dev))"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"class PciDevSpecTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a74a57a_3594a741","line":352,"in_reply_to":"5a74a57a_1d2357a8","updated":"2016-11-28 07:30:34.000000000","message":"I see you point the name of the parameter needs to be change it can be either a string (for glob) or a dict (for regex)\n\nI added test to in https://review.openstack.org/#/c/199488/26/nova/tests/unit/pci/test_whitelist.py that get it as a string but the whitlist convert it to json and than pass it to the PciDeviceSpec. so the address field can be string or dict.\nhttps://github.com/openstack/nova/blob/master/nova/pci/whitelist.py#L37-L62","commit_id":"332c15664affaf37265fecb8eca923c7bf065403"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8fd0c18062eef32bafbb144acb8f1ce355f1d4a5","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                                },"},{"line_number":350,"context_line":"                    \"physical_network\": \"hr_net\"}"},{"line_number":351,"context_line":"        pci \u003d devspec.PciDeviceSpec(pci_info)"},{"line_number":352,"context_line":"        self.assertTrue(pci.match(dev))"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"class PciDevSpecTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a74a57a_1d2357a8","line":352,"in_reply_to":"5a74a57a_ec63ab18","updated":"2016-11-28 00:25:21.000000000","message":"The current code only ever passes a *string* to the WhitelistPciAddress._init_address_fields() method (lines 260 and 268 of nova/pci/devspec.py. I don\u0027t see anywhere other than in the above tests where the current code is constructing a WhitelistPciAddress object by passing in a dict and not a string.\n\nAnd because of that, I\u0027d like to see a test of passing a *string* to WhitelistPciAddress._init_address_fields() where the string contains *regex* syntax and not *glob* syntax.","commit_id":"332c15664affaf37265fecb8eca923c7bf065403"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a45148cbb17da192ef0eb3ac4cf6c6f7299ca6f8","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        invalid_val_addr \u003d {\"domain\": devspec.MAX_DOMAIN + 1,"},{"line_number":49,"context_line":"                            \"bus\": devspec.MAX_BUS + 1,"},{"line_number":50,"context_line":"                            \"slot\": devspec.MAX_SLOT + 1,"},{"line_number":51,"context_line":"                            \"function\": devspec.MAX_FUNC + 1}"},{"line_number":52,"context_line":"        for component in invalid_val_addr:"},{"line_number":53,"context_line":"            address \u003d dict(self.pci_addr)"},{"line_number":54,"context_line":"            address[component] \u003d str(invalid_val_addr[component])"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a71b18c_e8f71057","line":51,"updated":"2016-12-08 20:27:16.000000000","message":"Sorry if I didn\u0027t communicate what I was looking for properly. What I was saying in the previous patch was that I think it will be a very common mistake for operators to think they can use glob syntax with the dict-expression construction of the PCI passthrough whitelist. In other words, I have a feeling operators will do this:\n\n pci_passthrough_whitelist \u003d \u0027\n     ...\n     \"address\": {\n         \"slot\": \"*\",\n         \"bus\": \"*\",\n         \"domain\": \"01\",\n         \"function\": \"[2-5]\"\n     }\n     ...\n\nwhich contain glob-style \"*\" syntax for the slot and bus which is not a valid regex.\n\nSo, I was asking you to put in some validation tests for this scenario.\n\nThanks!\n\n-jay","commit_id":"377e92dec5f97e4658b5e842f50b4e8fd1537bbc"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"a36e5dbe8009eaa32d798e0b2b6d58a892497ef5","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        invalid_val_addr \u003d {\"domain\": devspec.MAX_DOMAIN + 1,"},{"line_number":49,"context_line":"                            \"bus\": devspec.MAX_BUS + 1,"},{"line_number":50,"context_line":"                            \"slot\": devspec.MAX_SLOT + 1,"},{"line_number":51,"context_line":"                            \"function\": devspec.MAX_FUNC + 1}"},{"line_number":52,"context_line":"        for component in invalid_val_addr:"},{"line_number":53,"context_line":"            address \u003d dict(self.pci_addr)"},{"line_number":54,"context_line":"            address[component] \u003d str(invalid_val_addr[component])"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a71b18c_ca276510","line":51,"in_reply_to":"3a71b18c_e8f71057","updated":"2016-12-10 23:00:01.000000000","message":"Done","commit_id":"377e92dec5f97e4658b5e842f50b4e8fd1537bbc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"560c14668132df24f504bcbd2d891981acc133c1","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        self.assertEqual(phys_addr.slot, \"01\")"},{"line_number":157,"context_line":"        self.assertEqual(phys_addr.func, \"[0-2]\")"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def test_init_invalid_address(self):"},{"line_number":160,"context_line":"        invalid_addresses \u003d [{\"domain\": \"*\","},{"line_number":161,"context_line":"                              \"bus\": \"02\","},{"line_number":162,"context_line":"                              \"slot\": \"01\","}],"source_content_type":"text/x-python","patch_set":29,"id":"3a71b18c_16397fd7","line":159,"updated":"2016-12-11 15:31:06.000000000","message":"thank you sir! :)","commit_id":"ce102be8fcc669f7da074aa2f92ec1a5dd966f9b"}]}
