)]}'
{"nova/tests/functional/libvirt/test_vgpu.py":[{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"ed9c80db49fcec6f84f1f89ed90a3cc7dc7b5492","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                                                   parent\u003dlibvirt_parent)})"},{"line_number":68,"context_line":"        return uuid"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _get_provider_uuid_by_name(self, name):"},{"line_number":71,"context_line":"        return self.placement_api.get("},{"line_number":72,"context_line":"            \u0027/resource_providers?name\u003d%s\u0027 % name).body["},{"line_number":73,"context_line":"            \u0027resource_providers\u0027][0][\u0027uuid\u0027]"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _get_all_rp_uuids_in_a_tree(self, in_tree_rp_uuid):"},{"line_number":76,"context_line":"        rps \u003d self.placement_api.get("},{"line_number":77,"context_line":"            \u0027/resource_providers?in_tree\u003d%s\u0027 % in_tree_rp_uuid,"},{"line_number":78,"context_line":"            version\u003d\u00271.20\u0027).body[\u0027resource_providers\u0027]"},{"line_number":79,"context_line":"        return [rp[\u0027uuid\u0027] for rp in rps]"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _get_provider_inventory(self, rp_uuid):"},{"line_number":82,"context_line":"        return self.placement_api.get("},{"line_number":83,"context_line":"            \u0027/resource_providers/%s/inventories\u0027 % rp_uuid).body[\u0027inventories\u0027]"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _get_provider_usages(self, provider_uuid):"},{"line_number":86,"context_line":"        return self.placement_api.get("},{"line_number":87,"context_line":"            \u0027/resource_providers/%s/usages\u0027 % provider_uuid).body[\u0027usages\u0027]"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _create_trait(self, trait):"},{"line_number":90,"context_line":"        return self.placement_api.put(\u0027/traits/%s\u0027 % trait, {}, version\u003d\u00271.6\u0027)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _set_provider_traits(self, rp_uuid, traits):"},{"line_number":93,"context_line":"        \"\"\"This will overwrite any existing traits."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        :param rp_uuid: UUID of the resource provider to update"},{"line_number":96,"context_line":"        :param traits: list of trait strings to set on the provider"},{"line_number":97,"context_line":"        :returns: APIResponse object with the results"},{"line_number":98,"context_line":"        \"\"\""},{"line_number":99,"context_line":"        provider \u003d self.placement_api.get("},{"line_number":100,"context_line":"            \u0027/resource_providers/%s\u0027 % rp_uuid).body"},{"line_number":101,"context_line":"        put_traits_req \u003d {"},{"line_number":102,"context_line":"            \u0027resource_provider_generation\u0027: provider[\u0027generation\u0027],"},{"line_number":103,"context_line":"            \u0027traits\u0027: traits"},{"line_number":104,"context_line":"        }"},{"line_number":105,"context_line":"        return self.placement_api.put("},{"line_number":106,"context_line":"            \u0027/resource_providers/%s/traits\u0027 % rp_uuid,"},{"line_number":107,"context_line":"            put_traits_req, version\u003d\u00271.6\u0027)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def _start_compute_service(self, hostname):"},{"line_number":110,"context_line":"        self.fake_connection \u003d self._get_connection("}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_ea767706","line":107,"range":{"start_line":70,"start_character":1,"end_line":107,"end_character":42},"updated":"2020-04-08 10:03:41.000000000","message":"Appears generic enough to be useful outside of these tests.","commit_id":"cfed5fb1b2c383ca4d907764db23cef0e7ae95f5"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"feea0e2dc29bab1de549389ddc0a42acfd6a3147","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                                                   parent\u003dlibvirt_parent)})"},{"line_number":68,"context_line":"        return uuid"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _get_provider_uuid_by_name(self, name):"},{"line_number":71,"context_line":"        return self.placement_api.get("},{"line_number":72,"context_line":"            \u0027/resource_providers?name\u003d%s\u0027 % name).body["},{"line_number":73,"context_line":"            \u0027resource_providers\u0027][0][\u0027uuid\u0027]"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _get_all_rp_uuids_in_a_tree(self, in_tree_rp_uuid):"},{"line_number":76,"context_line":"        rps \u003d self.placement_api.get("},{"line_number":77,"context_line":"            \u0027/resource_providers?in_tree\u003d%s\u0027 % in_tree_rp_uuid,"},{"line_number":78,"context_line":"            version\u003d\u00271.20\u0027).body[\u0027resource_providers\u0027]"},{"line_number":79,"context_line":"        return [rp[\u0027uuid\u0027] for rp in rps]"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _get_provider_inventory(self, rp_uuid):"},{"line_number":82,"context_line":"        return self.placement_api.get("},{"line_number":83,"context_line":"            \u0027/resource_providers/%s/inventories\u0027 % rp_uuid).body[\u0027inventories\u0027]"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _get_provider_usages(self, provider_uuid):"},{"line_number":86,"context_line":"        return self.placement_api.get("},{"line_number":87,"context_line":"            \u0027/resource_providers/%s/usages\u0027 % provider_uuid).body[\u0027usages\u0027]"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _create_trait(self, trait):"},{"line_number":90,"context_line":"        return self.placement_api.put(\u0027/traits/%s\u0027 % trait, {}, version\u003d\u00271.6\u0027)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _set_provider_traits(self, rp_uuid, traits):"},{"line_number":93,"context_line":"        \"\"\"This will overwrite any existing traits."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        :param rp_uuid: UUID of the resource provider to update"},{"line_number":96,"context_line":"        :param traits: list of trait strings to set on the provider"},{"line_number":97,"context_line":"        :returns: APIResponse object with the results"},{"line_number":98,"context_line":"        \"\"\""},{"line_number":99,"context_line":"        provider \u003d self.placement_api.get("},{"line_number":100,"context_line":"            \u0027/resource_providers/%s\u0027 % rp_uuid).body"},{"line_number":101,"context_line":"        put_traits_req \u003d {"},{"line_number":102,"context_line":"            \u0027resource_provider_generation\u0027: provider[\u0027generation\u0027],"},{"line_number":103,"context_line":"            \u0027traits\u0027: traits"},{"line_number":104,"context_line":"        }"},{"line_number":105,"context_line":"        return self.placement_api.put("},{"line_number":106,"context_line":"            \u0027/resource_providers/%s/traits\u0027 % rp_uuid,"},{"line_number":107,"context_line":"            put_traits_req, version\u003d\u00271.6\u0027)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def _start_compute_service(self, hostname):"},{"line_number":110,"context_line":"        self.fake_connection \u003d self._get_connection("}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_e307bdc8","line":107,"range":{"start_line":70,"start_character":1,"end_line":107,"end_character":42},"in_reply_to":"df33271e_c15439cd","updated":"2020-04-08 14:22:35.000000000","message":"Awesome thanks.","commit_id":"cfed5fb1b2c383ca4d907764db23cef0e7ae95f5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"1b43cdf122c7095e2fdb3e7c986b7f862233c6f3","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                                                   parent\u003dlibvirt_parent)})"},{"line_number":68,"context_line":"        return uuid"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _get_provider_uuid_by_name(self, name):"},{"line_number":71,"context_line":"        return self.placement_api.get("},{"line_number":72,"context_line":"            \u0027/resource_providers?name\u003d%s\u0027 % name).body["},{"line_number":73,"context_line":"            \u0027resource_providers\u0027][0][\u0027uuid\u0027]"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _get_all_rp_uuids_in_a_tree(self, in_tree_rp_uuid):"},{"line_number":76,"context_line":"        rps \u003d self.placement_api.get("},{"line_number":77,"context_line":"            \u0027/resource_providers?in_tree\u003d%s\u0027 % in_tree_rp_uuid,"},{"line_number":78,"context_line":"            version\u003d\u00271.20\u0027).body[\u0027resource_providers\u0027]"},{"line_number":79,"context_line":"        return [rp[\u0027uuid\u0027] for rp in rps]"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _get_provider_inventory(self, rp_uuid):"},{"line_number":82,"context_line":"        return self.placement_api.get("},{"line_number":83,"context_line":"            \u0027/resource_providers/%s/inventories\u0027 % rp_uuid).body[\u0027inventories\u0027]"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _get_provider_usages(self, provider_uuid):"},{"line_number":86,"context_line":"        return self.placement_api.get("},{"line_number":87,"context_line":"            \u0027/resource_providers/%s/usages\u0027 % provider_uuid).body[\u0027usages\u0027]"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _create_trait(self, trait):"},{"line_number":90,"context_line":"        return self.placement_api.put(\u0027/traits/%s\u0027 % trait, {}, version\u003d\u00271.6\u0027)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _set_provider_traits(self, rp_uuid, traits):"},{"line_number":93,"context_line":"        \"\"\"This will overwrite any existing traits."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        :param rp_uuid: UUID of the resource provider to update"},{"line_number":96,"context_line":"        :param traits: list of trait strings to set on the provider"},{"line_number":97,"context_line":"        :returns: APIResponse object with the results"},{"line_number":98,"context_line":"        \"\"\""},{"line_number":99,"context_line":"        provider \u003d self.placement_api.get("},{"line_number":100,"context_line":"            \u0027/resource_providers/%s\u0027 % rp_uuid).body"},{"line_number":101,"context_line":"        put_traits_req \u003d {"},{"line_number":102,"context_line":"            \u0027resource_provider_generation\u0027: provider[\u0027generation\u0027],"},{"line_number":103,"context_line":"            \u0027traits\u0027: traits"},{"line_number":104,"context_line":"        }"},{"line_number":105,"context_line":"        return self.placement_api.put("},{"line_number":106,"context_line":"            \u0027/resource_providers/%s/traits\u0027 % rp_uuid,"},{"line_number":107,"context_line":"            put_traits_req, version\u003d\u00271.6\u0027)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def _start_compute_service(self, hostname):"},{"line_number":110,"context_line":"        self.fake_connection \u003d self._get_connection("}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_c15439cd","line":107,"range":{"start_line":70,"start_character":1,"end_line":107,"end_character":42},"in_reply_to":"df33271e_ea767706","updated":"2020-04-08 11:07:03.000000000","message":"Yeah totally, hence the WIP. \nFWIW, we already have them in a base class ProviderUsageBaseTestCase [1] but we don\u0027t inherit from it.\nWe could move the below methods to a parent base class, but I wanted to rush on this one to prove it works.\n\n[1] https://github.com/openstack/nova/blob/cd16ae2/nova/tests/functional/integrated_helpers.py#L563-L600","commit_id":"cfed5fb1b2c383ca4d907764db23cef0e7ae95f5"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"ed9c80db49fcec6f84f1f89ed90a3cc7dc7b5492","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            enabled_vgpu_types\u003d[fakelibvirt.NVIDIA_11_VGPU_TYPE,"},{"line_number":175,"context_line":"                                fakelibvirt.NVIDIA_12_VGPU_TYPE],"},{"line_number":176,"context_line":"            group\u003d\u0027devices\u0027)"},{"line_number":177,"context_line":"        # we need to call the below again to ensure the updated"},{"line_number":178,"context_line":"        # \u0027device_addresses\u0027 value is read and the new groups created"},{"line_number":179,"context_line":"        nova.conf.devices.register_dynamic_opts(CONF)"},{"line_number":180,"context_line":"        # host1 will have 2 physical GPUs :"},{"line_number":181,"context_line":"        #  - 0000:81:00.0 will only support nvidia-11"},{"line_number":182,"context_line":"        #  - 0000:81:01.0 will only support nvidia-12"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_caba9308","line":179,"range":{"start_line":177,"start_character":0,"end_line":179,"end_character":53},"updated":"2020-04-08 10:03:41.000000000","message":"Odd, even when the compute isn\u0027t started until L191?","commit_id":"cfed5fb1b2c383ca4d907764db23cef0e7ae95f5"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"feea0e2dc29bab1de549389ddc0a42acfd6a3147","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            enabled_vgpu_types\u003d[fakelibvirt.NVIDIA_11_VGPU_TYPE,"},{"line_number":175,"context_line":"                                fakelibvirt.NVIDIA_12_VGPU_TYPE],"},{"line_number":176,"context_line":"            group\u003d\u0027devices\u0027)"},{"line_number":177,"context_line":"        # we need to call the below again to ensure the updated"},{"line_number":178,"context_line":"        # \u0027device_addresses\u0027 value is read and the new groups created"},{"line_number":179,"context_line":"        nova.conf.devices.register_dynamic_opts(CONF)"},{"line_number":180,"context_line":"        # host1 will have 2 physical GPUs :"},{"line_number":181,"context_line":"        #  - 0000:81:00.0 will only support nvidia-11"},{"line_number":182,"context_line":"        #  - 0000:81:01.0 will only support nvidia-12"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_a3fdb5b2","line":179,"range":{"start_line":177,"start_character":0,"end_line":179,"end_character":53},"in_reply_to":"df33271e_01d3c139","updated":"2020-04-08 14:22:35.000000000","message":"Ah TIL thanks!","commit_id":"cfed5fb1b2c383ca4d907764db23cef0e7ae95f5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"1b43cdf122c7095e2fdb3e7c986b7f862233c6f3","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            enabled_vgpu_types\u003d[fakelibvirt.NVIDIA_11_VGPU_TYPE,"},{"line_number":175,"context_line":"                                fakelibvirt.NVIDIA_12_VGPU_TYPE],"},{"line_number":176,"context_line":"            group\u003d\u0027devices\u0027)"},{"line_number":177,"context_line":"        # we need to call the below again to ensure the updated"},{"line_number":178,"context_line":"        # \u0027device_addresses\u0027 value is read and the new groups created"},{"line_number":179,"context_line":"        nova.conf.devices.register_dynamic_opts(CONF)"},{"line_number":180,"context_line":"        # host1 will have 2 physical GPUs :"},{"line_number":181,"context_line":"        #  - 0000:81:00.0 will only support nvidia-11"},{"line_number":182,"context_line":"        #  - 0000:81:01.0 will only support nvidia-12"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_01d3c139","line":179,"range":{"start_line":177,"start_character":0,"end_line":179,"end_character":53},"in_reply_to":"df33271e_caba9308","updated":"2020-04-08 11:07:03.000000000","message":"Yeah, it\u0027s not a problem with the nova-compute service or with the .flags() method, just oslo.config that needs to create the according objects in memory.\n\nSee the implementation of https://review.opendev.org/#/c/564440/ that needs this too.","commit_id":"cfed5fb1b2c383ca4d907764db23cef0e7ae95f5"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"ed9c80db49fcec6f84f1f89ed90a3cc7dc7b5492","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        mdevs \u003d self.compute1.driver._get_mediated_devices()"},{"line_number":199,"context_line":"        self.assertEqual(1, len(mdevs))"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        # We can be deterministic : since 0000:81:01.0 is asked to only support"},{"line_number":202,"context_line":"        # nvidia-12 *BUT* doesn\u0027t actually have this type as a PCI capability,"},{"line_number":203,"context_line":"        # we are sure that only 0000:81:00.0 is used."},{"line_number":204,"context_line":"        parent_name \u003d mdevs[0][\u0027parent\u0027]"},{"line_number":205,"context_line":"        self.assertEqual(fakelibvirt.PGPU1_PCI_ADDR, parent_name)"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_ca43b3ae","line":203,"range":{"start_line":201,"start_character":0,"end_line":203,"end_character":53},"updated":"2020-04-08 10:03:41.000000000","message":"So if we created another instance it wouldn\u0027t use nvidia-12?","commit_id":"cfed5fb1b2c383ca4d907764db23cef0e7ae95f5"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"feea0e2dc29bab1de549389ddc0a42acfd6a3147","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        mdevs \u003d self.compute1.driver._get_mediated_devices()"},{"line_number":199,"context_line":"        self.assertEqual(1, len(mdevs))"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        # We can be deterministic : since 0000:81:01.0 is asked to only support"},{"line_number":202,"context_line":"        # nvidia-12 *BUT* doesn\u0027t actually have this type as a PCI capability,"},{"line_number":203,"context_line":"        # we are sure that only 0000:81:00.0 is used."},{"line_number":204,"context_line":"        parent_name \u003d mdevs[0][\u0027parent\u0027]"},{"line_number":205,"context_line":"        self.assertEqual(fakelibvirt.PGPU1_PCI_ADDR, parent_name)"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_23e085fa","line":203,"range":{"start_line":201,"start_character":0,"end_line":203,"end_character":53},"in_reply_to":"df33271e_a1c49560","updated":"2020-04-08 14:22:35.000000000","message":"ACK thanks.","commit_id":"cfed5fb1b2c383ca4d907764db23cef0e7ae95f5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"1b43cdf122c7095e2fdb3e7c986b7f862233c6f3","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        mdevs \u003d self.compute1.driver._get_mediated_devices()"},{"line_number":199,"context_line":"        self.assertEqual(1, len(mdevs))"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        # We can be deterministic : since 0000:81:01.0 is asked to only support"},{"line_number":202,"context_line":"        # nvidia-12 *BUT* doesn\u0027t actually have this type as a PCI capability,"},{"line_number":203,"context_line":"        # we are sure that only 0000:81:00.0 is used."},{"line_number":204,"context_line":"        parent_name \u003d mdevs[0][\u0027parent\u0027]"},{"line_number":205,"context_line":"        self.assertEqual(fakelibvirt.PGPU1_PCI_ADDR, parent_name)"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_a1c49560","line":203,"range":{"start_line":201,"start_character":0,"end_line":203,"end_character":53},"in_reply_to":"df33271e_ca43b3ae","updated":"2020-04-08 11:07:03.000000000","message":"*None* of the created instances can have a nvidia-12 type since *none* of the existing GPUs (even 0000:81:01.0) have available mdev capacity for using this type.\n\nSee the below second test, I\u0027m actually modifying 0000:81:01.0 to have some mdev capacity for nvidia-12.","commit_id":"cfed5fb1b2c383ca4d907764db23cef0e7ae95f5"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"ed9c80db49fcec6f84f1f89ed90a3cc7dc7b5492","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        self._set_provider_traits(pgpu1_rp_uuid, [\u0027CUSTOM_NVIDIA_11\u0027])"},{"line_number":233,"context_line":"        self._set_provider_traits(pgpu2_rp_uuid, [\u0027CUSTOM_NVIDIA_12\u0027])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # Add a trait to the flavor"},{"line_number":236,"context_line":"        extra_spec \u003d {\"resources:VGPU\": \"1\","},{"line_number":237,"context_line":"                      \"trait:CUSTOM_NVIDIA_11\": \"required\"}"},{"line_number":238,"context_line":"        flavor \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        # Use the new flavor for booting"},{"line_number":241,"context_line":"        self._create_server("},{"line_number":242,"context_line":"            image_uuid\u003d\u0027155d900f-4e14-4e4c-a73d-069cbf4541e6\u0027,"},{"line_number":243,"context_line":"            flavor_id\u003dflavor, host\u003dself.compute1.host,"},{"line_number":244,"context_line":"            expected_state\u003d\u0027ACTIVE\u0027)"},{"line_number":245,"context_line":"        mdevs \u003d self.compute1.driver._get_mediated_devices()"},{"line_number":246,"context_line":"        self.assertEqual(1, len(mdevs))"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        # We can be deterministic : since 0000:81:01.0 is asked to only support"},{"line_number":249,"context_line":"        # nvidia-12, we are sure that only 0000:81:00.0 is used."},{"line_number":250,"context_line":"        parent_name \u003d mdevs[0][\u0027parent\u0027]"},{"line_number":251,"context_line":"        self.assertEqual(fakelibvirt.PGPU1_PCI_ADDR, parent_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_6a354746","line":251,"range":{"start_line":235,"start_character":1,"end_line":251,"end_character":65},"updated":"2020-04-08 10:03:41.000000000","message":"I\u0027d repeat this for CUSTOM_NVIDIA_12 to be safe.","commit_id":"cfed5fb1b2c383ca4d907764db23cef0e7ae95f5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"1b43cdf122c7095e2fdb3e7c986b7f862233c6f3","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        self._set_provider_traits(pgpu1_rp_uuid, [\u0027CUSTOM_NVIDIA_11\u0027])"},{"line_number":233,"context_line":"        self._set_provider_traits(pgpu2_rp_uuid, [\u0027CUSTOM_NVIDIA_12\u0027])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # Add a trait to the flavor"},{"line_number":236,"context_line":"        extra_spec \u003d {\"resources:VGPU\": \"1\","},{"line_number":237,"context_line":"                      \"trait:CUSTOM_NVIDIA_11\": \"required\"}"},{"line_number":238,"context_line":"        flavor \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        # Use the new flavor for booting"},{"line_number":241,"context_line":"        self._create_server("},{"line_number":242,"context_line":"            image_uuid\u003d\u0027155d900f-4e14-4e4c-a73d-069cbf4541e6\u0027,"},{"line_number":243,"context_line":"            flavor_id\u003dflavor, host\u003dself.compute1.host,"},{"line_number":244,"context_line":"            expected_state\u003d\u0027ACTIVE\u0027)"},{"line_number":245,"context_line":"        mdevs \u003d self.compute1.driver._get_mediated_devices()"},{"line_number":246,"context_line":"        self.assertEqual(1, len(mdevs))"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        # We can be deterministic : since 0000:81:01.0 is asked to only support"},{"line_number":249,"context_line":"        # nvidia-12, we are sure that only 0000:81:00.0 is used."},{"line_number":250,"context_line":"        parent_name \u003d mdevs[0][\u0027parent\u0027]"},{"line_number":251,"context_line":"        self.assertEqual(fakelibvirt.PGPU1_PCI_ADDR, parent_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_21aec597","line":251,"range":{"start_line":235,"start_character":1,"end_line":251,"end_character":65},"in_reply_to":"df33271e_6a354746","updated":"2020-04-08 11:07:03.000000000","message":"Cool, I\u0027ll do.","commit_id":"cfed5fb1b2c383ca4d907764db23cef0e7ae95f5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7ff5633ddbe09fbb535fdeb441b4f5c9d67d8aed","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _start_compute_service(self, hostname):"},{"line_number":71,"context_line":"        self.fake_connection \u003d self._get_connection("},{"line_number":72,"context_line":"            # Need a host to support creating more servers with vpmems"},{"line_number":73,"context_line":"            host_info\u003dfakelibvirt.HostInfo(cpu_nodes\u003d2, cpu_sockets\u003d1,"},{"line_number":74,"context_line":"                                           cpu_cores\u003d2, cpu_threads\u003d2,"},{"line_number":75,"context_line":"                                           kB_mem\u003d15740000),"}],"source_content_type":"text/x-python","patch_set":11,"id":"df33271e_64e71714","line":72,"updated":"2020-04-09 10:23:45.000000000","message":"grah, forgot to remove this line","commit_id":"4082bd83e3fac74d646b86cd6eb887e0e8b4323c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3d253b9f9f93b2594b3354fdfc285918cef2b4d7","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        root_rp_uuid \u003d self._get_provider_uuid_by_name(self.compute1.host)"},{"line_number":171,"context_line":"        rp_uuids \u003d self._get_all_rp_uuids_in_a_tree(root_rp_uuid)"},{"line_number":172,"context_line":"        self.assertNotIn(self.compute1.host + \u0027_\u0027 + fakelibvirt.PGPU2_PCI_ADDR,"},{"line_number":173,"context_line":"                         rp_uuids)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def test_create_servers_with_specific_type(self):"},{"line_number":176,"context_line":"        # Regenerate the PCI addresses so both pGPUs now support nvidia-12"}],"source_content_type":"text/x-python","patch_set":11,"id":"df33271e_a9a8d81f","line":173,"range":{"start_line":173,"start_character":25,"end_line":173,"end_character":33},"updated":"2020-04-09 10:15:25.000000000","message":"This seems to be a list of UUIDs so the name you try to find will never be in it.\n\nhost1_pci_0000_81_01_0 in [\u00271c8c98d4-4eaa-4e4a-a910-23007aa6cf1d\u0027, \u0027ac35ba2a-aa82-467e-a02a-fa4e4537cfc6\u0027]","commit_id":"4082bd83e3fac74d646b86cd6eb887e0e8b4323c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b5a5db3e41b47ef840ca7118558e70715578862d","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                                                   parent\u003dlibvirt_parent)})"},{"line_number":68,"context_line":"        return uuid"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _start_compute_service(self, hostname):"},{"line_number":71,"context_line":"        self.fake_connection \u003d self._get_connection("},{"line_number":72,"context_line":"            host_info\u003dfakelibvirt.HostInfo(cpu_nodes\u003d2, kB_mem\u003d8192),"},{"line_number":73,"context_line":"            # We want to create two pGPUs but no other PCI devices"}],"source_content_type":"text/x-python","patch_set":12,"id":"df33271e_62f7068d","line":70,"range":{"start_line":70,"start_character":0,"end_line":70,"end_character":46},"updated":"2020-04-09 13:23:48.000000000","message":"It would be nice to override the \u0027start_computes\u0027 function from \u0027base.ServersTestBase\u0027 instead of adding another way to start this. However, I see this is how we\u0027ve done this in test_pci_sriov_servers.py so that could be a follow-up","commit_id":"9f3a256149eb97bdb2b9bc5efdd7cc86abf47c44"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"111658b7df3feb665dda8da57d8ea2e1fa2dedc2","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                                                   parent\u003dlibvirt_parent)})"},{"line_number":68,"context_line":"        return uuid"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _start_compute_service(self, hostname):"},{"line_number":71,"context_line":"        self.fake_connection \u003d self._get_connection("},{"line_number":72,"context_line":"            host_info\u003dfakelibvirt.HostInfo(cpu_nodes\u003d2, kB_mem\u003d8192),"},{"line_number":73,"context_line":"            # We want to create two pGPUs but no other PCI devices"}],"source_content_type":"text/x-python","patch_set":12,"id":"df33271e_f3764aa4","line":70,"range":{"start_line":70,"start_character":0,"end_line":70,"end_character":46},"in_reply_to":"df33271e_62f7068d","updated":"2020-04-09 14:29:52.000000000","message":"Ack, will provide a FUP","commit_id":"9f3a256149eb97bdb2b9bc5efdd7cc86abf47c44"}],"nova/tests/unit/virt/libvirt/fakelibvirt.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b5a5db3e41b47ef840ca7118558e70715578862d","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    addr_templ \u003d \"\u003caddress domain\u003d\u00270x0000\u0027 bus\u003d\u00270x81\u0027 slot\u003d\u0027%(slot)#02x\u0027 function\u003d\u0027%(function)#02x\u0027/\u003e\"  # noqa"},{"line_number":246,"context_line":"    mdevtypes_templ \u003d textwrap.dedent(\"\"\""},{"line_number":247,"context_line":"        \u003ctype id\u003d\u0027%(type_id)s\u0027\u003e"},{"line_number":248,"context_line":"        \u003cname\u003eGRID M60-0B\u003c/name\u003e\u003cdeviceAPI\u003evfio-pci\u003c/deviceAPI\u003e"},{"line_number":249,"context_line":"        \u003cavailableInstances\u003e%(instances)s\u003c/availableInstances\u003e"},{"line_number":250,"context_line":"        \u003c/type\u003e\"\"\".strip())  # noqa"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    is_capable_of_mdevs \u003d False"}],"source_content_type":"text/x-python","patch_set":12,"id":"df33271e_a5163848","line":249,"range":{"start_line":248,"start_character":8,"end_line":249,"end_character":62},"updated":"2020-04-09 13:23:48.000000000","message":"nit: missing indentation","commit_id":"9f3a256149eb97bdb2b9bc5efdd7cc86abf47c44"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"111658b7df3feb665dda8da57d8ea2e1fa2dedc2","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    addr_templ \u003d \"\u003caddress domain\u003d\u00270x0000\u0027 bus\u003d\u00270x81\u0027 slot\u003d\u0027%(slot)#02x\u0027 function\u003d\u0027%(function)#02x\u0027/\u003e\"  # noqa"},{"line_number":246,"context_line":"    mdevtypes_templ \u003d textwrap.dedent(\"\"\""},{"line_number":247,"context_line":"        \u003ctype id\u003d\u0027%(type_id)s\u0027\u003e"},{"line_number":248,"context_line":"        \u003cname\u003eGRID M60-0B\u003c/name\u003e\u003cdeviceAPI\u003evfio-pci\u003c/deviceAPI\u003e"},{"line_number":249,"context_line":"        \u003cavailableInstances\u003e%(instances)s\u003c/availableInstances\u003e"},{"line_number":250,"context_line":"        \u003c/type\u003e\"\"\".strip())  # noqa"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    is_capable_of_mdevs \u003d False"}],"source_content_type":"text/x-python","patch_set":12,"id":"df33271e_13592e34","line":249,"range":{"start_line":248,"start_character":8,"end_line":249,"end_character":62},"in_reply_to":"df33271e_a5163848","updated":"2020-04-09 14:29:52.000000000","message":"ack, will provide a FUP","commit_id":"9f3a256149eb97bdb2b9bc5efdd7cc86abf47c44"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b5a5db3e41b47ef840ca7118558e70715578862d","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        \"\"\""},{"line_number":378,"context_line":"        self.devices \u003d {}"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        if not (num_vfs or num_pfs) and not num_mdevcap:"},{"line_number":381,"context_line":"            return"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        if num_vfs and not num_pfs:"}],"source_content_type":"text/x-python","patch_set":12,"id":"df33271e_853cd4c8","line":380,"range":{"start_line":380,"start_character":8,"end_line":380,"end_character":56},"updated":"2020-04-09 13:23:48.000000000","message":"Or\n\n  if not (num_vfs or num_pfs or num_mdevcap):","commit_id":"9f3a256149eb97bdb2b9bc5efdd7cc86abf47c44"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"111658b7df3feb665dda8da57d8ea2e1fa2dedc2","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        \"\"\""},{"line_number":378,"context_line":"        self.devices \u003d {}"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        if not (num_vfs or num_pfs) and not num_mdevcap:"},{"line_number":381,"context_line":"            return"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        if num_vfs and not num_pfs:"}],"source_content_type":"text/x-python","patch_set":12,"id":"df33271e_d3522613","line":380,"range":{"start_line":380,"start_character":8,"end_line":380,"end_character":56},"in_reply_to":"df33271e_853cd4c8","updated":"2020-04-09 14:29:52.000000000","message":"I tried to make it more explicit for understanding that both num_vfs and num_pfs are related, while num_mdevcap is just a different argument.","commit_id":"9f3a256149eb97bdb2b9bc5efdd7cc86abf47c44"}]}
