)]}'
{"nova/virt/libvirt/device.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class LibvirtVGPUDevice(device.VGPUDevice):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self, uuid, type, parent):"},{"line_number":29,"context_line":"        super(LibvirtDeviceManager, self).__init__()"},{"line_number":30,"context_line":"        self.uuid \u003d uuid"},{"line_number":31,"context_line":"        self.type \u003d type"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_9a372100","line":28,"updated":"2019-07-15 10:21:00.000000000","message":"would be nice to have a doc string describing what is a type and what is the parent.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"3fc81e8daa6fb77e3fae7bdc437e9aa7de88e627","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class LibvirtVGPUDevice(device.VGPUDevice):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self, uuid, type, parent):"},{"line_number":29,"context_line":"        super(LibvirtDeviceManager, self).__init__()"},{"line_number":30,"context_line":"        self.uuid \u003d uuid"},{"line_number":31,"context_line":"        self.type \u003d type"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_89d4b921","line":28,"in_reply_to":"7faddb67_9a372100","updated":"2019-07-15 14:27:29.000000000","message":"got it","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class LibvirtDeviceManager(device.DeviceManager):"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __init__(self, driver):"},{"line_number":38,"context_line":"        self._driver \u003d driver"},{"line_number":39,"context_line":"        self._vgpu_list \u003d []"},{"line_number":40,"context_line":"        self._populate_existing_vgpus()"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_dd5d9315","line":37,"updated":"2019-07-15 10:21:00.000000000","message":"I think we missing a super call here.  Or is DeviceManager a puerly abstract class / interface?","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"3fc81e8daa6fb77e3fae7bdc437e9aa7de88e627","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class LibvirtDeviceManager(device.DeviceManager):"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __init__(self, driver):"},{"line_number":38,"context_line":"        self._driver \u003d driver"},{"line_number":39,"context_line":"        self._vgpu_list \u003d []"},{"line_number":40,"context_line":"        self._populate_existing_vgpus()"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_c9edd1f0","line":37,"in_reply_to":"7faddb67_dd5d9315","updated":"2019-07-15 14:27:29.000000000","message":"The DeviceManager is a purely abstract class now. Maybe we can have some common implement for multiple virt drivers, like if we need a common pci device management, then we can have common implement, and each virt driver can implement a device manage which is the subclass of that common pci deice management implement","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":35,"context_line":"class LibvirtDeviceManager(device.DeviceManager):"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __init__(self, driver):"},{"line_number":38,"context_line":"        self._driver \u003d driver"},{"line_number":39,"context_line":"        self._vgpu_list \u003d []"},{"line_number":40,"context_line":"        self._populate_existing_vgpus()"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_7a1b4580","line":38,"updated":"2019-07-15 10:21:00.000000000","message":"This creates a bidirectional dependency between the libvirt driver and the LibvirtDeviceManager. Can we restructure the code in a way that the dependecy only point to one direction? That would made the two class a lot less coupled.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c45b01d71626e6ff003a01f14eb2ed6061e13e4","unresolved":false,"context_lines":[{"line_number":35,"context_line":"class LibvirtDeviceManager(device.DeviceManager):"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __init__(self, driver):"},{"line_number":38,"context_line":"        self._driver \u003d driver"},{"line_number":39,"context_line":"        self._vgpu_list \u003d []"},{"line_number":40,"context_line":"        self._populate_existing_vgpus()"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_4fe7a1ad","line":38,"in_reply_to":"7faddb67_2993455d","updated":"2019-07-15 15:49:29.000000000","message":"Thanks. That looks a good direction.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"3fc81e8daa6fb77e3fae7bdc437e9aa7de88e627","unresolved":false,"context_lines":[{"line_number":35,"context_line":"class LibvirtDeviceManager(device.DeviceManager):"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __init__(self, driver):"},{"line_number":38,"context_line":"        self._driver \u003d driver"},{"line_number":39,"context_line":"        self._vgpu_list \u003d []"},{"line_number":40,"context_line":"        self._populate_existing_vgpus()"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_2993455d","line":38,"in_reply_to":"7faddb67_7a1b4580","updated":"2019-07-15 14:27:29.000000000","message":"I want to refactor it step by step. in the end, I want to move those mdev methods into this class.  And this class only reference to the nova.virt.libvirt.host.Host. That is why this patch is WIP","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self._populate_existing_vgpus()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _populate_existing_vgpus(self):"},{"line_number":43,"context_line":"        requested_types \u003d self._driver._get_supported_vgpu_types()"},{"line_number":44,"context_line":"        existing_mdevs \u003d self._driver._get_mediated_devices(requested_types[0])"},{"line_number":45,"context_line":"        assigned_mdevs \u003d self._driver._get_all_assigned_mediated_devices()"},{"line_number":46,"context_line":"        for mdev in existing_mdevs:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_fa0e5539","line":43,"range":{"start_line":43,"start_character":7,"end_line":43,"end_character":64},"updated":"2019-07-15 10:21:00.000000000","message":"The naming of the local variable and the function producing the local variable seems inconsistent. I guess here the local variable is named incorrectly as this code path is not handling an actual request but re-initialize the device manager.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"3fc81e8daa6fb77e3fae7bdc437e9aa7de88e627","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self._populate_existing_vgpus()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _populate_existing_vgpus(self):"},{"line_number":43,"context_line":"        requested_types \u003d self._driver._get_supported_vgpu_types()"},{"line_number":44,"context_line":"        existing_mdevs \u003d self._driver._get_mediated_devices(requested_types[0])"},{"line_number":45,"context_line":"        assigned_mdevs \u003d self._driver._get_all_assigned_mediated_devices()"},{"line_number":46,"context_line":"        for mdev in existing_mdevs:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_89903945","line":43,"range":{"start_line":43,"start_character":7,"end_line":43,"end_character":64},"in_reply_to":"7faddb67_fa0e5539","updated":"2019-07-15 14:27:29.000000000","message":"sorry, I\u0027m afraid I didn\u0027t get you.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _populate_existing_vgpus(self):"},{"line_number":43,"context_line":"        requested_types \u003d self._driver._get_supported_vgpu_types()"},{"line_number":44,"context_line":"        existing_mdevs \u003d self._driver._get_mediated_devices(requested_types[0])"},{"line_number":45,"context_line":"        assigned_mdevs \u003d self._driver._get_all_assigned_mediated_devices()"},{"line_number":46,"context_line":"        for mdev in existing_mdevs:"},{"line_number":47,"context_line":"            assigned \u003d mdev[\u0027uuid\u0027] in assigned_mdevs"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_da011908","line":44,"range":{"start_line":44,"start_character":59,"end_line":44,"end_character":78},"updated":"2019-07-15 10:21:00.000000000","message":"I think it needs a note why only the one type is handled here.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"3fc81e8daa6fb77e3fae7bdc437e9aa7de88e627","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _populate_existing_vgpus(self):"},{"line_number":43,"context_line":"        requested_types \u003d self._driver._get_supported_vgpu_types()"},{"line_number":44,"context_line":"        existing_mdevs \u003d self._driver._get_mediated_devices(requested_types[0])"},{"line_number":45,"context_line":"        assigned_mdevs \u003d self._driver._get_all_assigned_mediated_devices()"},{"line_number":46,"context_line":"        for mdev in existing_mdevs:"},{"line_number":47,"context_line":"            assigned \u003d mdev[\u0027uuid\u0027] in assigned_mdevs"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_699b7d65","line":44,"range":{"start_line":44,"start_character":59,"end_line":44,"end_character":78},"in_reply_to":"7faddb67_da011908","updated":"2019-07-15 14:27:29.000000000","message":"The current libvirt vgpu implement only supports one types. Actually, I only copy existing vgpu code at here.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        existing_mdevs \u003d self._driver._get_mediated_devices(requested_types[0])"},{"line_number":45,"context_line":"        assigned_mdevs \u003d self._driver._get_all_assigned_mediated_devices()"},{"line_number":46,"context_line":"        for mdev in existing_mdevs:"},{"line_number":47,"context_line":"            assigned \u003d mdev[\u0027uuid\u0027] in assigned_mdevs"},{"line_number":48,"context_line":"            instance_uuid \u003d (assigned_mdevs[mdev[\u0027uuid\u0027]]"},{"line_number":49,"context_line":"                if assigned else None)"},{"line_number":50,"context_line":"            vgpu_dev \u003d LibvirtVGPUDevice("},{"line_number":51,"context_line":"                mdev[\u0027uuid\u0027], requested_types[0], mdev[\u0027parent\u0027])"},{"line_number":52,"context_line":"            vgpu_dev.assign(instance_uuid)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_fd13af5a","line":49,"range":{"start_line":47,"start_character":1,"end_line":49,"end_character":38},"updated":"2019-07-15 10:21:00.000000000","message":"I think the following does the same thing:\n\n  instance_uuid \u003d assigned_mdevs.get(mdev[\u0027uuid\u0027])","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"3fc81e8daa6fb77e3fae7bdc437e9aa7de88e627","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        existing_mdevs \u003d self._driver._get_mediated_devices(requested_types[0])"},{"line_number":45,"context_line":"        assigned_mdevs \u003d self._driver._get_all_assigned_mediated_devices()"},{"line_number":46,"context_line":"        for mdev in existing_mdevs:"},{"line_number":47,"context_line":"            assigned \u003d mdev[\u0027uuid\u0027] in assigned_mdevs"},{"line_number":48,"context_line":"            instance_uuid \u003d (assigned_mdevs[mdev[\u0027uuid\u0027]]"},{"line_number":49,"context_line":"                if assigned else None)"},{"line_number":50,"context_line":"            vgpu_dev \u003d LibvirtVGPUDevice("},{"line_number":51,"context_line":"                mdev[\u0027uuid\u0027], requested_types[0], mdev[\u0027parent\u0027])"},{"line_number":52,"context_line":"            vgpu_dev.assign(instance_uuid)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_c9d711ee","line":49,"range":{"start_line":47,"start_character":1,"end_line":49,"end_character":38},"in_reply_to":"7faddb67_fd13af5a","updated":"2019-07-15 14:27:29.000000000","message":"yea, you are right.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                if assigned else None)"},{"line_number":50,"context_line":"            vgpu_dev \u003d LibvirtVGPUDevice("},{"line_number":51,"context_line":"                mdev[\u0027uuid\u0027], requested_types[0], mdev[\u0027parent\u0027])"},{"line_number":52,"context_line":"            vgpu_dev.assign(instance_uuid)"},{"line_number":53,"context_line":"            self._vgpu_list.append(vgpu_dev)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def claim_for_instance(self, instance, allocations):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_dd16f349","line":52,"range":{"start_line":52,"start_character":12,"end_line":52,"end_character":42},"updated":"2019-07-15 10:21:00.000000000","message":"This feels wrong as instance_uuid can be None. It will actually unassing the device if the instance_uuid is None here.\n\nThe inteface might be more logical with a simple getter and setter like device.user or device.instance_uuid then setting the device.instance_uuid is meaningfull even if what we set is None as the device is not used. \nThe is_assigned() function can be kept as is as.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"3fc81e8daa6fb77e3fae7bdc437e9aa7de88e627","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                if assigned else None)"},{"line_number":50,"context_line":"            vgpu_dev \u003d LibvirtVGPUDevice("},{"line_number":51,"context_line":"                mdev[\u0027uuid\u0027], requested_types[0], mdev[\u0027parent\u0027])"},{"line_number":52,"context_line":"            vgpu_dev.assign(instance_uuid)"},{"line_number":53,"context_line":"            self._vgpu_list.append(vgpu_dev)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def claim_for_instance(self, instance, allocations):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_a90c15a5","line":52,"range":{"start_line":52,"start_character":12,"end_line":52,"end_character":42},"in_reply_to":"7faddb67_dd16f349","updated":"2019-07-15 14:27:29.000000000","message":"got it.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                self._claim_for_vgpus(instance, vgpu_allocations))"},{"line_number":61,"context_line":"        return assigned_devices"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _claim_for_vgpus(self, instance, allocations):"},{"line_number":64,"context_line":"        # TODO(sbauza): Once we have nested resource providers, find which one"},{"line_number":65,"context_line":"        # is having the related allocation for the specific VGPU type."},{"line_number":66,"context_line":"        # For the moment, we should only have one allocation for"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_7d381f9f","line":63,"range":{"start_line":63,"start_character":8,"end_line":63,"end_character":24},"updated":"2019-07-15 10:21:00.000000000","message":"We are claiming vgpus for the instance here, so the name claim_for_vgpus seems wrong to me. Is it more like claim_vgpus or claim_vgpus_for_instance?","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"3fc81e8daa6fb77e3fae7bdc437e9aa7de88e627","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                self._claim_for_vgpus(instance, vgpu_allocations))"},{"line_number":61,"context_line":"        return assigned_devices"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _claim_for_vgpus(self, instance, allocations):"},{"line_number":64,"context_line":"        # TODO(sbauza): Once we have nested resource providers, find which one"},{"line_number":65,"context_line":"        # is having the related allocation for the specific VGPU type."},{"line_number":66,"context_line":"        # For the moment, we should only have one allocation for"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_49fd616c","line":63,"range":{"start_line":63,"start_character":8,"end_line":63,"end_character":24},"in_reply_to":"7faddb67_7d381f9f","updated":"2019-07-15 14:27:29.000000000","message":"ah, right. thanks, I will correct the name.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        # Which mediated devices are created but not assigned to a guest ?"},{"line_number":115,"context_line":"        mdevs_available \u003d [vgpu for vgpu in self._vgpu_list"},{"line_number":116,"context_line":"                                if not vgpu.assigned]"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        chosen_mdevs \u003d []"},{"line_number":119,"context_line":"        for c in six.moves.range(vgpus_asked):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_5d020371","line":116,"range":{"start_line":116,"start_character":44,"end_line":116,"end_character":52},"updated":"2019-07-15 10:21:00.000000000","message":"vgpu.is_assigned()","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                # Take the first available mdev"},{"line_number":123,"context_line":"                chosen_mdev \u003d mdevs_available.pop()"},{"line_number":124,"context_line":"            else:"},{"line_number":125,"context_line":"                chosen_mdev \u003d self._driver._create_new_mediated_device("},{"line_number":126,"context_line":"                    requested_types, parent\u003dparent_device)"},{"line_number":127,"context_line":"                if chosen_mdev:"},{"line_number":128,"context_line":"                    chosen_mdev.assigned\u003dTrue"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_3d0b877d","line":125,"updated":"2019-07-15 10:21:00.000000000","message":"Do we need to update the self._vgpu_list with the newly created device?","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":125,"context_line":"                chosen_mdev \u003d self._driver._create_new_mediated_device("},{"line_number":126,"context_line":"                    requested_types, parent\u003dparent_device)"},{"line_number":127,"context_line":"                if chosen_mdev:"},{"line_number":128,"context_line":"                    chosen_mdev.assigned\u003dTrue"},{"line_number":129,"context_line":"                    chosen_mdev.instance_uuid \u003d instance.uuid"},{"line_number":130,"context_line":"            if not chosen_mdev:"},{"line_number":131,"context_line":"                # If we can\u0027t find devices having available VGPUs, just raise"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_dded93b7","line":128,"range":{"start_line":128,"start_character":20,"end_line":128,"end_character":45},"updated":"2019-07-15 10:21:00.000000000","message":"no such field","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    def _unclaim_for_vgpus(self, instance):"},{"line_number":142,"context_line":"        for vgpu in self._vgpu_list:"},{"line_number":143,"context_line":"            if vgpu.instance_uuid \u003d instance.uuid:"},{"line_number":144,"context_line":"                vgpu.assigned \u003d False"},{"line_number":145,"context_line":"                vgpu.instance_uuid \u003d None"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def get_assigned_devices(self, instance):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_5d10c3a8","line":144,"range":{"start_line":144,"start_character":16,"end_line":144,"end_character":37},"updated":"2019-07-15 10:21:00.000000000","message":"nix","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def get_assigned_devices(self, instance):"},{"line_number":148,"context_line":"        assigned_devs \u003d []"},{"line_number":149,"context_line":"        assigned_devs.extend(self._get_claimed_vgpus(instance))"},{"line_number":150,"context_line":"        return assigned_devs"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def _get_assigned_vgpus(self, instance):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_5d8523ce","line":149,"range":{"start_line":149,"start_character":34,"end_line":149,"end_character":52},"updated":"2019-07-15 10:21:00.000000000","message":"_get_assigned_vgpus?","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"36f7f2e21f3adcd98407552c3606cc991e594fc4","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        context \u003d nova.context.get_admin_context()"},{"line_number":73,"context_line":"        instances \u003d objects.InstanceList.get_by_filters(context,"},{"line_number":74,"context_line":"            {\u0027uuid\u0027: list(assigned_mdevs.values())})"},{"line_number":75,"context_line":"        instance_flavor_id_mapping \u003d {"},{"line_number":76,"context_line":"            instance.uuid: instance.instance_type_id"},{"line_number":77,"context_line":"                for instance in instances}"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        for mdev in existing_mdevs:"},{"line_number":80,"context_line":"            instance_uuid \u003d assigned_mdevs.get(mdev[\u0027uuid\u0027], None)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_2cba9a09","line":77,"range":{"start_line":75,"start_character":8,"end_line":77,"end_character":42},"updated":"2019-07-30 08:08:42.000000000","message":"Consider that one instance is in VERIFY_RESIZE status, it has new and old flavor, we should map to old flavor on src host, and new flavor on dest host. So we need to build this mapping with migration context info.","commit_id":"923a703ab09b992467127d2f2ad98607efa0356b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"421eb10401b8d4929402e4ea3b5fee2a3e4d89d9","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        context \u003d nova.context.get_admin_context()"},{"line_number":73,"context_line":"        instances \u003d objects.InstanceList.get_by_filters(context,"},{"line_number":74,"context_line":"            {\u0027uuid\u0027: list(assigned_mdevs.values())})"},{"line_number":75,"context_line":"        instance_flavor_id_mapping \u003d {"},{"line_number":76,"context_line":"            instance.uuid: instance.instance_type_id"},{"line_number":77,"context_line":"                for instance in instances}"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        for mdev in existing_mdevs:"},{"line_number":80,"context_line":"            instance_uuid \u003d assigned_mdevs.get(mdev[\u0027uuid\u0027], None)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_4c7d961a","line":77,"range":{"start_line":75,"start_character":8,"end_line":77,"end_character":42},"in_reply_to":"7faddb67_2cba9a09","updated":"2019-07-30 08:15:18.000000000","message":"s/migration context/migration","commit_id":"923a703ab09b992467127d2f2ad98607efa0356b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"9b3bcb00ff94075cac3845a7c5256a0617362e4d","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        context \u003d nova.context.get_admin_context()"},{"line_number":73,"context_line":"        instances \u003d objects.InstanceList.get_by_filters(context,"},{"line_number":74,"context_line":"            {\u0027uuid\u0027: list(assigned_mdevs.values())})"},{"line_number":75,"context_line":"        instance_flavor_id_mapping \u003d {"},{"line_number":76,"context_line":"            instance.uuid: instance.instance_type_id"},{"line_number":77,"context_line":"                for instance in instances}"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        for mdev in existing_mdevs:"},{"line_number":80,"context_line":"            instance_uuid \u003d assigned_mdevs.get(mdev[\u0027uuid\u0027], None)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_4a5d7313","line":77,"range":{"start_line":75,"start_character":8,"end_line":77,"end_character":42},"in_reply_to":"7faddb67_4c7d961a","updated":"2019-07-30 13:02:59.000000000","message":"Thanks Luyao! I\u0027m thinking that should be added when the mdev resize bug fixed, so added a comment at https://review.opendev.org/#/c/671222/9/nova/virt/libvirt/device.py@74.","commit_id":"923a703ab09b992467127d2f2ad98607efa0356b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"c5e039748abbf601a00fc257e754efc8f593ce29","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                instance_flavor_id_mapping.get(instance_uuid, None))"},{"line_number":87,"context_line":"            self._mdev_list.append(vgpu_dev)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def update_provider_tree(self, provider_tree, nodename, allocations\u003dNone):"},{"line_number":90,"context_line":"        \"\"\"Update device inventories to provider tree"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        To be called by LibirtDriver.update_provider_tree, and pass all of"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_a9c023e2","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":28},"updated":"2019-08-08 08:14:40.000000000","message":"Why do we need this update_provider_tree in device manager? From my point of view, it is just called by by LibirtDriver.update_provider_tree, and calls the functions in libvirt driver later. Is this a bit redundant?","commit_id":"879d566f00540a30bb979661da34241530e904a0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8e8e30c00f9bbc725197c9cfd47922f2dd9e270c","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                instance_flavor_id_mapping.get(instance_uuid, None))"},{"line_number":87,"context_line":"            self._mdev_list.append(vgpu_dev)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def update_provider_tree(self, provider_tree, nodename, allocations\u003dNone):"},{"line_number":90,"context_line":"        \"\"\"Update device inventories to provider tree"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        To be called by LibirtDriver.update_provider_tree, and pass all of"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_0bfc9ab3","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":28},"in_reply_to":"7faddb67_a9c023e2","updated":"2019-08-12 06:48:02.000000000","message":"I thought you need the data inside DeviceManager to build up the inventories.","commit_id":"879d566f00540a30bb979661da34241530e904a0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"69587c293d1647908c5a087a587cd426c322af92","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                instance_flavor_id_mapping.get(instance_uuid, None))"},{"line_number":87,"context_line":"            self._mdev_list.append(vgpu_dev)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def update_provider_tree(self, provider_tree, nodename, allocations\u003dNone):"},{"line_number":90,"context_line":"        \"\"\"Update device inventories to provider tree"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        To be called by LibirtDriver.update_provider_tree, and pass all of"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_8b296a38","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":28},"in_reply_to":"7faddb67_a9c023e2","updated":"2019-08-12 06:50:33.000000000","message":"Like this, you access the private attributes of device manager to update  the inventories https://review.opendev.org/#/c/634551/17/nova/virt/libvirt/driver.py@6788","commit_id":"879d566f00540a30bb979661da34241530e904a0"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":3238,"context_line":"        mdevs \u003d []"},{"line_number":3239,"context_line":"        assigned_devices \u003d self.device_manager.get_assigned_devices(instance)"},{"line_number":3240,"context_line":"        for dev in assigned_devices:"},{"line_number":3241,"context_line":"            if isinstance(dev, LibvirtVGPUDevice):"},{"line_number":3242,"context_line":"                mdevs.append(dev.uuid)"},{"line_number":3243,"context_line":""},{"line_number":3244,"context_line":"        xml \u003d self._get_guest_xml(context, instance, network_info,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_7a15859b","line":3241,"updated":"2019-07-15 10:21:00.000000000","message":"checking for the object type smells like we missing some polymorphic function on the DeviceManager or on the Device itself.","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":6394,"context_line":"        :param uuid: The possible mdev UUID we want to create again"},{"line_number":6395,"context_line":"        :param parent: Only create a mdev for this device"},{"line_number":6396,"context_line":""},{"line_number":6397,"context_line":"        :returns: the newly created mdev UUID or None if not possible"},{"line_number":6398,"context_line":"        \"\"\""},{"line_number":6399,"context_line":"        # Try to see if we can still create a new mediated device"},{"line_number":6400,"context_line":"        devices \u003d self._get_mdev_capable_devices(requested_types)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_3a6aadec","line":6397,"updated":"2019-07-15 10:21:00.000000000","message":"It now returns an LibvirtVGPUDevice object","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":6415,"context_line":"                # We need the PCI address, not the libvirt name"},{"line_number":6416,"context_line":"                # The libvirt name is like \u0027pci_0000_84_00_0\u0027"},{"line_number":6417,"context_line":"                pci_addr \u003d \"{}:{}:{}.{}\".format(*dev_name[4:].split(\u0027_\u0027))"},{"line_number":6418,"context_line":"                mdev_uuid \u003d nova.privsep.libvirt.create_mdev(pci_addr,"},{"line_number":6419,"context_line":"                                                               asked_type,"},{"line_number":6420,"context_line":"                                                               uuid\u003duuid)"},{"line_number":6421,"context_line":"                return LibvirtVGPUDevice(mdev_uuid, asked_type, dev_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_ba569d29","line":6418,"range":{"start_line":6418,"start_character":16,"end_line":6418,"end_character":25},"updated":"2019-07-15 10:21:00.000000000","message":"chosen_mdev_uuid to not loose the original naming that, I think, has a reason","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"049340ad608ce99c272917b9cb17740a9537a29d","unresolved":false,"context_lines":[{"line_number":6418,"context_line":"                mdev_uuid \u003d nova.privsep.libvirt.create_mdev(pci_addr,"},{"line_number":6419,"context_line":"                                                               asked_type,"},{"line_number":6420,"context_line":"                                                               uuid\u003duuid)"},{"line_number":6421,"context_line":"                return LibvirtVGPUDevice(mdev_uuid, asked_type, dev_name)"},{"line_number":6422,"context_line":""},{"line_number":6423,"context_line":"    @utils.synchronized(VGPU_RESOURCE_SEMAPHORE)"},{"line_number":6424,"context_line":"    def _allocate_mdevs(self, allocations):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_da535938","line":6421,"updated":"2019-07-15 10:21:00.000000000","message":"I guess this is the point were this patch is unfinished. I think the caller of _create_new_mediated_device needs to be changed to handle the new return type. Also I guess the DeviceManager somehow needs to know that a new device is created / assigned.\n\nE.g. spawn -\u003e _allocate_mdevs -\u003e _create_new_mediated_device","commit_id":"3912ecaba03213aaacd5ab0a8701703483886e03"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"c5e039748abbf601a00fc257e754efc8f593ce29","unresolved":false,"context_lines":[{"line_number":643,"context_line":"            self._recreate_assigned_mediated_devices()"},{"line_number":644,"context_line":"            supports_mdev \u003d True"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        self._device_manager.initialize(supports_mdev)"},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        self._device_manager.initialize()"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"    @staticmethod"},{"line_number":651,"context_line":"    def _is_existing_mdev(uuid):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_892e87a9","line":648,"range":{"start_line":646,"start_character":1,"end_line":648,"end_character":41},"updated":"2019-08-08 08:14:40.000000000","message":"duplicated","commit_id":"879d566f00540a30bb979661da34241530e904a0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f80fbbf11ea7a54afb3a221f8d079e76ba016fcd","unresolved":false,"context_lines":[{"line_number":643,"context_line":"            self._recreate_assigned_mediated_devices()"},{"line_number":644,"context_line":"            supports_mdev \u003d True"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        self._device_manager.initialize(supports_mdev)"},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        self._device_manager.initialize()"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"    @staticmethod"},{"line_number":651,"context_line":"    def _is_existing_mdev(uuid):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_cbd44222","line":648,"range":{"start_line":646,"start_character":1,"end_line":648,"end_character":41},"in_reply_to":"7faddb67_892e87a9","updated":"2019-08-12 06:51:28.000000000","message":"oops, must be a mistake of rebase","commit_id":"879d566f00540a30bb979661da34241530e904a0"}]}
