)]}'
{"os_win/exceptions.py":[{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"699ca0243f4035a19dd7baaba37770c44e141aed","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    msg_fmt \u003d _(\"Resource could not be found: %(resource)s\")"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class PciNotFound(NotFound):"},{"line_number":57,"context_line":"    msg_fmt \u003d _(\"No assignable PCI device with vendor id: %(vendor_id)s and \""},{"line_number":58,"context_line":"                \"product id: %(product_id)s was found.\")"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_0fb921cc","line":56,"range":{"start_line":56,"start_character":6,"end_line":56,"end_character":17},"updated":"2017-01-18 12:58:55.000000000","message":"How about PCIDeviceNotFound?","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"ace85cc7c566270fef7479e95163d4ee58318c3b","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    msg_fmt \u003d _(\"Resource could not be found: %(resource)s\")"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class PciNotFound(NotFound):"},{"line_number":57,"context_line":"    msg_fmt \u003d _(\"No assignable PCI device with vendor id: %(vendor_id)s and \""},{"line_number":58,"context_line":"                \"product id: %(product_id)s was found.\")"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_6423a756","line":56,"range":{"start_line":56,"start_character":6,"end_line":56,"end_character":17},"in_reply_to":"7a3c09a3_0fb921cc","updated":"2017-01-18 13:53:33.000000000","message":"Done","commit_id":"63512de53e04e76f213741086b52f3cb01870608"}],"os_win/utils/compute/vmutils.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"a8631f8c2598cce6d9e3390b91eee2e4d6d7bc6d","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"    def _get_virtual_system_type(self, is_planned_vm):"},{"line_number":1111,"context_line":"        return ("},{"line_number":1112,"context_line":"            self._VIRTUAL_SYSTEM_TYPE_PLANNED if is_planned_vm"},{"line_number":1113,"context_line":"            else self._VIRTUAL_SYSTEM_TYPE_REALIZED)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa6399be_aef1e197","side":"PARENT","line":1113,"updated":"2016-10-17 20:35:04.000000000","message":"why are you removing those?","commit_id":"91febc2021e7834cd9ca0b34bd1e070285c4015b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"a8631f8c2598cce6d9e3390b91eee2e4d6d7bc6d","unresolved":false,"context_lines":[{"line_number":1101,"context_line":"    def is_secure_vm(self, instance_name):"},{"line_number":1102,"context_line":"        return False"},{"line_number":1103,"context_line":""},{"line_number":1104,"context_line":"    def set_vm_automatic_shutdownaction(self, vm_name):"},{"line_number":1105,"context_line":"        vmsetting \u003d _vmutils._lookup_vm_check(vm_name)"},{"line_number":1106,"context_line":"        vmsetting.AutomaticShutdownAction \u003d 2"},{"line_number":1107,"context_line":"        self._modify_virtual_system(vmsetting)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa6399be_6e250909","line":1104,"updated":"2016-10-17 20:35:04.000000000","message":"what exactly has to do with PCI devices?\n\nalso, \"set_vm_automatic_shutdown_action\", and you could add an arg called \"action\".","commit_id":"3ca905467bbc94124cf549b0b3264d9a3526ea3c"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"a8631f8c2598cce6d9e3390b91eee2e4d6d7bc6d","unresolved":false,"context_lines":[{"line_number":1103,"context_line":""},{"line_number":1104,"context_line":"    def set_vm_automatic_shutdownaction(self, vm_name):"},{"line_number":1105,"context_line":"        vmsetting \u003d _vmutils._lookup_vm_check(vm_name)"},{"line_number":1106,"context_line":"        vmsetting.AutomaticShutdownAction \u003d 2"},{"line_number":1107,"context_line":"        self._modify_virtual_system(vmsetting)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa6399be_ae1f21b6","line":1106,"updated":"2016-10-17 20:35:04.000000000","message":"make it a constant.","commit_id":"3ca905467bbc94124cf549b0b3264d9a3526ea3c"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"699ca0243f4035a19dd7baaba37770c44e141aed","unresolved":false,"context_lines":[{"line_number":1127,"context_line":"            self._VIRTUAL_SYSTEM_TYPE_PLANNED if is_planned_vm"},{"line_number":1128,"context_line":"            else self._VIRTUAL_SYSTEM_TYPE_REALIZED)"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    def set_vm_automatic_shutdown_action(self, vm_name, shutdown_action):"},{"line_number":1131,"context_line":"        vmsettings \u003d self._lookup_vm_check(vm_name)"},{"line_number":1132,"context_line":"        vmsettings.AutomaticShutdownAction \u003d shutdown_action"},{"line_number":1133,"context_line":"        self._modify_virtual_system(vmsettings)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_efbe95ac","line":1130,"updated":"2017-01-18 12:58:55.000000000","message":"So, update_vm already does this. Wondering if we actually need a separate method as well.","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"ace85cc7c566270fef7479e95163d4ee58318c3b","unresolved":false,"context_lines":[{"line_number":1127,"context_line":"            self._VIRTUAL_SYSTEM_TYPE_PLANNED if is_planned_vm"},{"line_number":1128,"context_line":"            else self._VIRTUAL_SYSTEM_TYPE_REALIZED)"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    def set_vm_automatic_shutdown_action(self, vm_name, shutdown_action):"},{"line_number":1131,"context_line":"        vmsettings \u003d self._lookup_vm_check(vm_name)"},{"line_number":1132,"context_line":"        vmsettings.AutomaticShutdownAction \u003d shutdown_action"},{"line_number":1133,"context_line":"        self._modify_virtual_system(vmsettings)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_97c36737","line":1130,"in_reply_to":"7a3c09a3_efbe95ac","updated":"2017-01-18 13:53:33.000000000","message":"Done","commit_id":"63512de53e04e76f213741086b52f3cb01870608"}],"os_win/utils/compute/vmutils10.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"a8631f8c2598cce6d9e3390b91eee2e4d6d7bc6d","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                                       \u0027was found\u0027) % device_location)"},{"line_number":209,"context_line":"        elif len(discrete_device)\u003e1:"},{"line_number":210,"context_line":"            raise exception.NotFound(_(\u0027Assignable device with location: %s \u0027"},{"line_number":211,"context_line":"                                       \u0027is already in use\u0027) % device_location)"},{"line_number":212,"context_line":"        else:"},{"line_number":213,"context_line":"            return discrete_device[0]"},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa6399be_4eebe5b0","line":211,"updated":"2016-10-17 20:35:04.000000000","message":"don\u0027t those  Msvm_PciExpress objects have unique LocationPaths anyways? Meaning that this can\u0027t ever be the case?","commit_id":"3ca905467bbc94124cf549b0b3264d9a3526ea3c"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"a8631f8c2598cce6d9e3390b91eee2e4d6d7bc6d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"fa6399be_0ea56db4","line":216,"updated":"2016-10-17 20:35:04.000000000","message":"too many blank lines.","commit_id":"3ca905467bbc94124cf549b0b3264d9a3526ea3c"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"d278933050df79090eec22a3df45ba1ac39e1279","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    def _get_discrete_device(self, instance, pci_spec):"},{"line_number":207,"context_line":"        discrete_devices \u003d self._conn.Msvm_PciExpress(SystemName\u003dinstance.host)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        pattern \u003d \"^(.*)VEN_%(vendor_id)s\u0026DEV_%(product_id)s\u0026(.*)$\" % ("},{"line_number":210,"context_line":"                  {\u0027vendor_id\u0027: pci_spec[\u0027vendor_id\u0027],"},{"line_number":211,"context_line":"                   \u0027product_id\u0027: pci_spec[\u0027product_id\u0027]})"},{"line_number":212,"context_line":"        for dev in discrete_devices:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_0b6f3afc","line":209,"range":{"start_line":209,"start_character":8,"end_line":209,"end_character":15},"updated":"2016-11-29 14:30:54.000000000","message":"Is there any chance this pattern would match multiple device ids?","commit_id":"ff546491fa3237075d6bb98d94aeb6c5514060f0"},{"author":{"_account_id":12582,"name":"Simona Iuliana Toader","email":"itoader@cloudbasesolutions.com","username":"itoader"},"change_message_id":"e487dca19d0489204b89fa04e31870849034db48","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    def _get_discrete_device(self, instance, pci_spec):"},{"line_number":207,"context_line":"        discrete_devices \u003d self._conn.Msvm_PciExpress(SystemName\u003dinstance.host)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        pattern \u003d \"^(.*)VEN_%(vendor_id)s\u0026DEV_%(product_id)s\u0026(.*)$\" % ("},{"line_number":210,"context_line":"                  {\u0027vendor_id\u0027: pci_spec[\u0027vendor_id\u0027],"},{"line_number":211,"context_line":"                   \u0027product_id\u0027: pci_spec[\u0027product_id\u0027]})"},{"line_number":212,"context_line":"        for dev in discrete_devices:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_03ebea13","line":209,"range":{"start_line":209,"start_character":8,"end_line":209,"end_character":15},"in_reply_to":"5a74a57a_0b6f3afc","updated":"2016-12-06 00:13:36.000000000","message":"This pattern will match all the devices which have the specified vendor_id and product_id. Multiple devices can have the same vendor and product id.","commit_id":"ff546491fa3237075d6bb98d94aeb6c5514060f0"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"d278933050df79090eec22a3df45ba1ac39e1279","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                   \u0027product_id\u0027: pci_spec[\u0027product_id\u0027]})"},{"line_number":212,"context_line":"        for dev in discrete_devices:"},{"line_number":213,"context_line":"            if re.match(pattern, dev.DeviceID):"},{"line_number":214,"context_line":"                discrete_devices_found \u003d self._conn.Msvm_PciExpress("},{"line_number":215,"context_line":"                    LocationPath\u003ddev.LocationPath)"},{"line_number":216,"context_line":"                # device is not in use by other VM"},{"line_number":217,"context_line":"                if len(discrete_devices_found) \u003d\u003d 1:"},{"line_number":218,"context_line":"                    return discrete_devices_found[0]"},{"line_number":219,"context_line":"        err \u003d (_(\"No assignable device with vendor id: \""},{"line_number":220,"context_line":"                 \"%(vendor_id)s and product id: %(product_id)s was\""},{"line_number":221,"context_line":"                 \" found.\") %"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_6b926ef7","line":218,"range":{"start_line":214,"start_character":16,"end_line":218,"end_character":52},"updated":"2016-11-29 14:30:54.000000000","message":"Will this return an empty list if the device is already assigned?","commit_id":"ff546491fa3237075d6bb98d94aeb6c5514060f0"},{"author":{"_account_id":12582,"name":"Simona Iuliana Toader","email":"itoader@cloudbasesolutions.com","username":"itoader"},"change_message_id":"e487dca19d0489204b89fa04e31870849034db48","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                   \u0027product_id\u0027: pci_spec[\u0027product_id\u0027]})"},{"line_number":212,"context_line":"        for dev in discrete_devices:"},{"line_number":213,"context_line":"            if re.match(pattern, dev.DeviceID):"},{"line_number":214,"context_line":"                discrete_devices_found \u003d self._conn.Msvm_PciExpress("},{"line_number":215,"context_line":"                    LocationPath\u003ddev.LocationPath)"},{"line_number":216,"context_line":"                # device is not in use by other VM"},{"line_number":217,"context_line":"                if len(discrete_devices_found) \u003d\u003d 1:"},{"line_number":218,"context_line":"                    return discrete_devices_found[0]"},{"line_number":219,"context_line":"        err \u003d (_(\"No assignable device with vendor id: \""},{"line_number":220,"context_line":"                 \"%(vendor_id)s and product id: %(product_id)s was\""},{"line_number":221,"context_line":"                 \" found.\") %"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_83cc5a6b","line":218,"range":{"start_line":214,"start_character":16,"end_line":218,"end_character":52},"in_reply_to":"5a74a57a_6b926ef7","updated":"2016-12-06 00:13:36.000000000","message":"If the device is already assigned, the list will contain another discrete device object beside the default discrete device one. If the discrete device is not assigned, the list will return exactly one discrete device object, having the host the same with the machine it is assigned to.","commit_id":"ff546491fa3237075d6bb98d94aeb6c5514060f0"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"8fd5c90751c5007a2ae90f9772646dfd0258a16f","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            return security_profile[0].EncryptStateAndVmMigrationTraffic"},{"line_number":195,"context_line":"        return False"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def add_pci_passthrough(self, instance, pci_spec):"},{"line_number":198,"context_line":"        vmsettings \u003d self._lookup_vm_check(instance.name)"},{"line_number":199,"context_line":"        pci_setting_data \u003d self._get_new_setting_data("},{"line_number":200,"context_line":"            self._PCI_EXPRESS_SETTING_DATA)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5201f7_1a03b343","line":197,"updated":"2017-01-03 18:14:18.000000000","message":"this should also exist in vmutils.\n\nalso, we don\u0027t accept nova objects in os-win.","commit_id":"cf3a00896994286ab71adee08b5dfffdb480c5d6"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"8fd5c90751c5007a2ae90f9772646dfd0258a16f","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        self._jobutils.add_virt_resource(pci_setting_data, vmsettings)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def _get_discrete_device(self, instance, pci_spec):"},{"line_number":207,"context_line":"        discrete_devices \u003d self._conn.Msvm_PciExpress(SystemName\u003dinstance.host)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        pattern \u003d \"^(.*)VEN_%(vendor_id)s\u0026DEV_%(product_id)s\u0026(.*)$\" % ("},{"line_number":210,"context_line":"                  {\u0027vendor_id\u0027: pci_spec[\u0027vendor_id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5201f7_bd29c18b","line":207,"updated":"2017-01-03 18:14:18.000000000","message":"hmm, won\u0027t all Msvm_PciExpress object have the same SystemName (the local one)?","commit_id":"cf3a00896994286ab71adee08b5dfffdb480c5d6"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"8fd5c90751c5007a2ae90f9772646dfd0258a16f","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                 \" found.\") %"},{"line_number":222,"context_line":"               {\u0027vendor_id\u0027: pci_spec[\u0027vendor_id\u0027],"},{"line_number":223,"context_line":"                \u0027product_id\u0027: pci_spec[\u0027product_id\u0027]})"},{"line_number":224,"context_line":"        raise exceptions.NotFound(message\u003derr)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5201f7_9d4ddd74","line":224,"updated":"2017-01-03 18:14:18.000000000","message":"Hm, I\u0027d add a PciNotFound exception.","commit_id":"cf3a00896994286ab71adee08b5dfffdb480c5d6"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"699ca0243f4035a19dd7baaba37770c44e141aed","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        return False"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def add_pci_device(self, vm_name, vendor_id, product_id):"},{"line_number":213,"context_line":"        \"\"\"Adds the given PCI to the given VM."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        :param vm_name: the name of the VM to which the PCI device will be"},{"line_number":216,"context_line":"            attached to."}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_ef29359c","line":213,"range":{"start_line":213,"start_character":26,"end_line":213,"end_character":29},"updated":"2017-01-18 12:58:55.000000000","message":"nit: PCI device","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"ace85cc7c566270fef7479e95163d4ee58318c3b","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        return False"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def add_pci_device(self, vm_name, vendor_id, product_id):"},{"line_number":213,"context_line":"        \"\"\"Adds the given PCI to the given VM."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        :param vm_name: the name of the VM to which the PCI device will be"},{"line_number":216,"context_line":"            attached to."}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_faa652bf","line":213,"range":{"start_line":213,"start_character":26,"end_line":213,"end_character":29},"in_reply_to":"7a3c09a3_ef29359c","updated":"2017-01-18 13:53:33.000000000","message":"Done","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"699ca0243f4035a19dd7baaba37770c44e141aed","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        vmsettings \u003d self._lookup_vm_check(vm_name)"},{"line_number":223,"context_line":"        pci_setting_data \u003d self._get_new_setting_data("},{"line_number":224,"context_line":"            self._PCI_EXPRESS_SETTING_DATA)"},{"line_number":225,"context_line":"        discrete_device \u003d self._get_discrete_device(vendor_id, product_id)"},{"line_number":226,"context_line":"        pci_setting_data.HostResource \u003d [discrete_device.path_()]"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        self._jobutils.add_virt_resource(pci_setting_data, vmsettings)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_c4453b43","line":225,"range":{"start_line":225,"start_character":8,"end_line":225,"end_character":23},"updated":"2017-01-18 12:58:55.000000000","message":"nit: I guess we should just refer to them as a \u0027pci_device\u0027 or \u0027assignable_device\u0027.\n\nThe \u0027discrete\u0027 term describes the assignment, not the device.","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"ace85cc7c566270fef7479e95163d4ee58318c3b","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        vmsettings \u003d self._lookup_vm_check(vm_name)"},{"line_number":223,"context_line":"        pci_setting_data \u003d self._get_new_setting_data("},{"line_number":224,"context_line":"            self._PCI_EXPRESS_SETTING_DATA)"},{"line_number":225,"context_line":"        discrete_device \u003d self._get_discrete_device(vendor_id, product_id)"},{"line_number":226,"context_line":"        pci_setting_data.HostResource \u003d [discrete_device.path_()]"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        self._jobutils.add_virt_resource(pci_setting_data, vmsettings)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_7a93425b","line":225,"range":{"start_line":225,"start_character":8,"end_line":225,"end_character":23},"in_reply_to":"7a3c09a3_c4453b43","updated":"2017-01-18 13:53:33.000000000","message":"Done","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"699ca0243f4035a19dd7baaba37770c44e141aed","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        self._jobutils.add_virt_resource(pci_setting_data, vmsettings)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _get_discrete_device(self, vendor_id, product_id):"},{"line_number":231,"context_line":"        discrete_devices \u003d self._conn.Msvm_PciExpress()"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        pattern \u003d re.compile("}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_41b85d75","line":230,"range":{"start_line":230,"start_character":8,"end_line":230,"end_character":28},"updated":"2017-01-18 12:58:55.000000000","message":"How about \u0027_get_assignable_pci_device\u0027?","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"ace85cc7c566270fef7479e95163d4ee58318c3b","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        self._jobutils.add_virt_resource(pci_setting_data, vmsettings)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _get_discrete_device(self, vendor_id, product_id):"},{"line_number":231,"context_line":"        discrete_devices \u003d self._conn.Msvm_PciExpress()"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        pattern \u003d re.compile("}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_baa76aa5","line":230,"range":{"start_line":230,"start_character":8,"end_line":230,"end_character":28},"in_reply_to":"7a3c09a3_41b85d75","updated":"2017-01-18 13:53:33.000000000","message":"Done","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"699ca0243f4035a19dd7baaba37770c44e141aed","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                \u0027vendor_id\u0027: vendor_id, \u0027product_id\u0027: product_id})"},{"line_number":236,"context_line":"        for dev in discrete_devices:"},{"line_number":237,"context_line":"            if pattern.match(dev.DeviceID):"},{"line_number":238,"context_line":"                discrete_devices_found \u003d [d for d in discrete_devices if"},{"line_number":239,"context_line":"                                          d.LocationPath \u003d\u003d dev.LocationPath]"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"                # device is not in use by other VM"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_8f28b19b","line":238,"updated":"2017-01-18 12:58:55.000000000","message":"For debugging purposes, I think it would be useful to log the devices we\u0027ve found.\n\nConsidering Iulia\u0027s comment:\n\"If the device is already assigned, the list will contain another discrete device object beside the default discrete device one. If the discrete device is not assigned, the list will return exactly one discrete device object, having the host the same with the machine it is assigned to.\"\n\n\nI think this should be mentioned in an inline comment.","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"ace85cc7c566270fef7479e95163d4ee58318c3b","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                \u0027vendor_id\u0027: vendor_id, \u0027product_id\u0027: product_id})"},{"line_number":236,"context_line":"        for dev in discrete_devices:"},{"line_number":237,"context_line":"            if pattern.match(dev.DeviceID):"},{"line_number":238,"context_line":"                discrete_devices_found \u003d [d for d in discrete_devices if"},{"line_number":239,"context_line":"                                          d.LocationPath \u003d\u003d dev.LocationPath]"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"                # device is not in use by other VM"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_9a2e2ea3","line":238,"in_reply_to":"7a3c09a3_8f28b19b","updated":"2017-01-18 13:53:33.000000000","message":"Done","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"699ca0243f4035a19dd7baaba37770c44e141aed","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                                     product_id\u003dproduct_id)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def remove_pci_device(self, vm_name, vendor_id, product_id):"},{"line_number":249,"context_line":"        \"\"\"Removes the given PCI from the given VM."},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        :param vm_name: the name of the VM from which the PCI device will be"},{"line_number":252,"context_line":"            attached from."}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_2f1edd6f","line":249,"range":{"start_line":249,"start_character":29,"end_line":249,"end_character":32},"updated":"2017-01-18 12:58:55.000000000","message":"nit: PCI device","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"ace85cc7c566270fef7479e95163d4ee58318c3b","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                                     product_id\u003dproduct_id)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def remove_pci_device(self, vm_name, vendor_id, product_id):"},{"line_number":249,"context_line":"        \"\"\"Removes the given PCI from the given VM."},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        :param vm_name: the name of the VM from which the PCI device will be"},{"line_number":252,"context_line":"            attached from."}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_1afdde6d","line":249,"range":{"start_line":249,"start_character":29,"end_line":249,"end_character":32},"in_reply_to":"7a3c09a3_2f1edd6f","updated":"2017-01-18 13:53:33.000000000","message":"Done","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"699ca0243f4035a19dd7baaba37770c44e141aed","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            vmsettings.InstanceID)"},{"line_number":265,"context_line":"        pci_sds \u003d [sd for sd in pci_sds if pattern.match(sd.HostResource[0])]"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        if pci_sds:"},{"line_number":268,"context_line":"            self._jobutils.remove_virt_resource(pci_sds[0])"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_813fa5b2","line":267,"updated":"2017-01-18 12:58:55.000000000","message":"Let\u0027s log a debug message in case we cannot find it.","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"ace85cc7c566270fef7479e95163d4ee58318c3b","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            vmsettings.InstanceID)"},{"line_number":265,"context_line":"        pci_sds \u003d [sd for sd in pci_sds if pattern.match(sd.HostResource[0])]"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        if pci_sds:"},{"line_number":268,"context_line":"            self._jobutils.remove_virt_resource(pci_sds[0])"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_7af6e28f","line":267,"in_reply_to":"7a3c09a3_813fa5b2","updated":"2017-01-18 13:53:33.000000000","message":"Done","commit_id":"63512de53e04e76f213741086b52f3cb01870608"}],"os_win/utils/hostutils10.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"a8631f8c2598cce6d9e3390b91eee2e4d6d7bc6d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        return host_config.IsHostGuarded"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def get_assignable_devices(self):"},{"line_number":59,"context_line":"        return self._conn.Msvm_PciExpress()"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa6399be_ae02c1b2","line":59,"updated":"2016-10-17 20:35:04.000000000","message":"please don\u0027t return wmi objects outside of os-win.","commit_id":"3ca905467bbc94124cf549b0b3264d9a3526ea3c"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"d278933050df79090eec22a3df45ba1ac39e1279","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def get_pci_address(self, device_instance_path):"},{"line_number":79,"context_line":"        pnp_device \u003d self._conn_cimv2.Win32_PnPEntity("},{"line_number":80,"context_line":"            DeviceID\u003ddevice_instance_path)"},{"line_number":81,"context_line":"        (return_code,"},{"line_number":82,"context_line":"         pnp_device_properties) \u003d pnp_device[0].GetDeviceProperties()"},{"line_number":83,"context_line":"        pnp_props \u003d {prop.KeyName: prop.Data for prop in pnp_device_properties}"},{"line_number":84,"context_line":"        location_info \u003d pnp_props[\u0027DEVPKEY_Device_LocationInfo\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_7e14eee7","line":81,"range":{"start_line":81,"start_character":9,"end_line":81,"end_character":20},"updated":"2016-11-29 14:30:54.000000000","message":"Shouldn\u0027t we check the return code?","commit_id":"ff546491fa3237075d6bb98d94aeb6c5514060f0"},{"author":{"_account_id":12582,"name":"Simona Iuliana Toader","email":"itoader@cloudbasesolutions.com","username":"itoader"},"change_message_id":"e487dca19d0489204b89fa04e31870849034db48","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def get_pci_address(self, device_instance_path):"},{"line_number":79,"context_line":"        pnp_device \u003d self._conn_cimv2.Win32_PnPEntity("},{"line_number":80,"context_line":"            DeviceID\u003ddevice_instance_path)"},{"line_number":81,"context_line":"        (return_code,"},{"line_number":82,"context_line":"         pnp_device_properties) \u003d pnp_device[0].GetDeviceProperties()"},{"line_number":83,"context_line":"        pnp_props \u003d {prop.KeyName: prop.Data for prop in pnp_device_properties}"},{"line_number":84,"context_line":"        location_info \u003d pnp_props[\u0027DEVPKEY_Device_LocationInfo\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_a3c9565b","line":81,"range":{"start_line":81,"start_character":9,"end_line":81,"end_character":20},"in_reply_to":"5a74a57a_7e14eee7","updated":"2016-12-06 00:13:36.000000000","message":"Done","commit_id":"ff546491fa3237075d6bb98d94aeb6c5514060f0"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"8fd5c90751c5007a2ae90f9772646dfd0258a16f","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        return host_config.IsHostGuarded"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_pci_passthrough_devices(self):"},{"line_number":61,"context_line":"        \"\"\"Get host PCI devices path."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        :returns: a list of the assignable PCI devices path"},{"line_number":64,"context_line":"        \"\"\""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # pci_devices contains all available pcis. When a pci is used,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5201f7_5d6375dc","line":63,"range":{"start_line":61,"start_character":0,"end_line":63,"end_character":59},"updated":"2017-01-03 18:14:18.000000000","message":"paths*","commit_id":"cf3a00896994286ab71adee08b5dfffdb480c5d6"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"699ca0243f4035a19dd7baaba37770c44e141aed","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :returns: a list of the assignable PCI devices."},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        # pci_device_objects contains all available PCIs. When a PCI is used,"},{"line_number":78,"context_line":"        # another object containing the same devices_instance_path is added"},{"line_number":79,"context_line":"        pci_device_objects \u003d self._conn.Msvm_PciExpress()"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_e1d2295b","line":77,"range":{"start_line":77,"start_character":65,"end_line":77,"end_character":68},"updated":"2017-01-18 12:58:55.000000000","message":"nit: PCI device","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"ace85cc7c566270fef7479e95163d4ee58318c3b","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :returns: a list of the assignable PCI devices."},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        # pci_device_objects contains all available PCIs. When a PCI is used,"},{"line_number":78,"context_line":"        # another object containing the same devices_instance_path is added"},{"line_number":79,"context_line":"        pci_device_objects \u003d self._conn.Msvm_PciExpress()"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_15d92f57","line":77,"range":{"start_line":77,"start_character":65,"end_line":77,"end_character":68},"in_reply_to":"7a3c09a3_e1d2295b","updated":"2017-01-18 13:53:33.000000000","message":"Done","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"699ca0243f4035a19dd7baaba37770c44e141aed","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            if pci_path in processed_pci_dev_path:"},{"line_number":86,"context_line":"                continue"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"            address \u003d self._get_pci_device_address(pci_path)"},{"line_number":89,"context_line":"            vendor_id \u003d self._PCI_VENDOR_ID_REGEX.findall(pci_path)"},{"line_number":90,"context_line":"            product_id \u003d self._PCI_PRODUCT_ID_REGEX.findall(pci_path)"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_a19e6160","line":88,"updated":"2017-01-18 12:58:55.000000000","message":"So this address may be missing, considering the bellow comment. Should we skip the device in that case?\n\nAlso, maybe it would be safer to move this logic handling individual pci devices to a separate method, such as \u0027_get_pci_device_info(self, pci_device_path)\u0027.\n\nMaybe for some devices we won\u0027t be able to fetch this info, in that case we may want to skip them ,log something and return the others.\n\nWe\u0027ve been through similar situations with FC HBAs.","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"ace85cc7c566270fef7479e95163d4ee58318c3b","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            if pci_path in processed_pci_dev_path:"},{"line_number":86,"context_line":"                continue"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"            address \u003d self._get_pci_device_address(pci_path)"},{"line_number":89,"context_line":"            vendor_id \u003d self._PCI_VENDOR_ID_REGEX.findall(pci_path)"},{"line_number":90,"context_line":"            product_id \u003d self._PCI_PRODUCT_ID_REGEX.findall(pci_path)"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_d5c24752","line":88,"in_reply_to":"7a3c09a3_a19e6160","updated":"2017-01-18 13:53:33.000000000","message":"we are skipping them. see L92.","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"699ca0243f4035a19dd7baaba37770c44e141aed","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    def _get_pci_device_address(self, pci_device_path):"},{"line_number":108,"context_line":"        pnp_device \u003d self._conn_cimv2.Win32_PnPEntity(DeviceID\u003dpci_device_path)"},{"line_number":109,"context_line":"        (return_code, pnp_device_props) \u003d pnp_device[0].GetDeviceProperties()"},{"line_number":110,"context_line":"        if return_code:"},{"line_number":111,"context_line":"            # The properties of the Plug and Play device could not be retrieved"},{"line_number":112,"context_line":"            return"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_21b3510b","line":110,"updated":"2017-01-18 12:58:55.000000000","message":"Shouldn\u0027t we at least log something?","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"ace85cc7c566270fef7479e95163d4ee58318c3b","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    def _get_pci_device_address(self, pci_device_path):"},{"line_number":108,"context_line":"        pnp_device \u003d self._conn_cimv2.Win32_PnPEntity(DeviceID\u003dpci_device_path)"},{"line_number":109,"context_line":"        (return_code, pnp_device_props) \u003d pnp_device[0].GetDeviceProperties()"},{"line_number":110,"context_line":"        if return_code:"},{"line_number":111,"context_line":"            # The properties of the Plug and Play device could not be retrieved"},{"line_number":112,"context_line":"            return"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a3c09a3_7598b378","line":110,"in_reply_to":"7a3c09a3_21b3510b","updated":"2017-01-18 13:53:33.000000000","message":"Done","commit_id":"63512de53e04e76f213741086b52f3cb01870608"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"5be7e8c419ebc0f4b7ebc9ad023630843f41fdf2","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                int(domain), int(bus), int(slot), int(funct))"},{"line_number":127,"context_line":"            return address"},{"line_number":128,"context_line":"        except Exception as ex:"},{"line_number":129,"context_line":"            LOG.debug(ex)"},{"line_number":130,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_911c4c6b","line":129,"range":{"start_line":129,"start_character":22,"end_line":129,"end_character":24},"updated":"2017-01-18 15:19:37.000000000","message":"Should we log something a bit more meaningful? Such as:\n\n\u0027Failed to get PCI device address. Device path: (device_path)s. Exception: %(ex)s\u0027.\n\nOtherwise you may see some type errors through your logs without knowing their source.","commit_id":"dda3d5a2bd90c43699ef335a026f7b39b72dc22d"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"claudiu.belu@canonical.com","username":"claudiub"},"change_message_id":"26d5ccb308cd1330b6ad94621ef97ef02208e375","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                int(domain), int(bus), int(slot), int(funct))"},{"line_number":127,"context_line":"            return address"},{"line_number":128,"context_line":"        except Exception as ex:"},{"line_number":129,"context_line":"            LOG.debug(ex)"},{"line_number":130,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_320f1338","line":129,"range":{"start_line":129,"start_character":22,"end_line":129,"end_character":24},"in_reply_to":"7a3c09a3_911c4c6b","updated":"2017-01-18 16:45:55.000000000","message":"Done","commit_id":"dda3d5a2bd90c43699ef335a026f7b39b72dc22d"}]}
