)]}'
{"nova/conductor/tasks/migrate.py":[{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"ce09d7c934977cba28d98f5e0c72962f2a142626","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        # scheduler.utils methods use directly the NovaObject."},{"line_number":51,"context_line":"        self.request_spec \u003d objects.RequestSpec.from_components("},{"line_number":52,"context_line":"            self.context, self.instance.uuid, image,"},{"line_number":53,"context_line":"            self.instance.flavor, self.instance.numa_topology,"},{"line_number":54,"context_line":"            self.instance.pci_requests, legacy_props, None,"},{"line_number":55,"context_line":"            self.instance.availability_zone)"},{"line_number":56,"context_line":"        # NOTE(sbauza): Force_hosts/nodes needs to be reset"}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa78d24_2425d609","line":53,"range":{"start_line":53,"start_character":34,"end_line":53,"end_character":61},"updated":"2016-07-15 06:35:44.000000000","message":"The root cause is that request_spec is assigned with the *old* numa_topology here. It should always be the numa topology specified from flavor and image properties in request_spec.\n\nSo I think the fix should start from replacing this.","commit_id":"15787ffb6e541a502a175a3d8386a5e61873f336"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"ce09d7c934977cba28d98f5e0c72962f2a142626","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # is not forced to be the original host"},{"line_number":59,"context_line":"        self.request_spec.reset_forced_destinations()"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        instance \u003d objects.Instance.get_by_uuid("},{"line_number":62,"context_line":"            self.context, self.instance.uuid, expected_attrs\u003d[])"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        if instance is not None and\\"},{"line_number":65,"context_line":"                        self.request_spec.flavor.id !\u003d instance.flavor.id:"},{"line_number":66,"context_line":"            self.request_spec.numa_topology \u003d hardware.numa_get_constraints("},{"line_number":67,"context_line":"                self.request_spec.flavor, self.request_spec.image)"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa78d24_a461c613","line":65,"range":{"start_line":61,"start_character":8,"end_line":65,"end_character":74},"updated":"2016-07-15 06:35:44.000000000","message":"Instance numa topology should be generated according to the newest flavor information.\n\nFor example, we should consider the situation when we update related fields in the flavor and try to resize the instance using the same flavor id.","commit_id":"15787ffb6e541a502a175a3d8386a5e61873f336"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"9308cc0b3472695c5f4d4a8b455b5bc7cf2f3056","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        # scheduler.utils methods use directly the NovaObject."},{"line_number":52,"context_line":"        self.request_spec \u003d objects.RequestSpec.from_components("},{"line_number":53,"context_line":"            self.context, self.instance.uuid, image,"},{"line_number":54,"context_line":"            self.instance.flavor, request_numa_topology,"},{"line_number":55,"context_line":"            self.instance.pci_requests, legacy_props, None,"},{"line_number":56,"context_line":"            self.instance.availability_zone)"},{"line_number":57,"context_line":"        # NOTE(sbauza): Force_hosts/nodes needs to be reset"}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_f7f2aa05","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":32},"updated":"2016-07-27 15:11:44.000000000","message":"so I think most of the problem is coming from here, and has been identified in my bugfix https://review.openstack.org/#/c/347387/\n\nIf we assume that we would set the right flavor, but keeps the original numa_topology, that would still work, right ?\n\nIf so, I think we can abandon that change and just make sure we merge mine.","commit_id":"7ec98e52d676bf2aba54517621aa3904cb54ac03"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"7c1a472bba490be73ad08fd8d7da91ba7722d183","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        # scheduler.utils methods use directly the NovaObject."},{"line_number":52,"context_line":"        self.request_spec \u003d objects.RequestSpec.from_components("},{"line_number":53,"context_line":"            self.context, self.instance.uuid, image,"},{"line_number":54,"context_line":"            self.instance.flavor, request_numa_topology,"},{"line_number":55,"context_line":"            self.instance.pci_requests, legacy_props, None,"},{"line_number":56,"context_line":"            self.instance.availability_zone)"},{"line_number":57,"context_line":"        # NOTE(sbauza): Force_hosts/nodes needs to be reset"}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_a4ce2658","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":32},"in_reply_to":"bacf61ea_50b447f1","updated":"2016-07-28 02:33:45.000000000","message":"@Sylvain: I agree with @liuxiuli. NUMATopologyFilter is using spec_obj.numa_topology [1]. And it is actually the *original* numa topology passed here before this fix, see the implementation of \"RequestSpec.from_components\" [2].\n\n[1] https://github.com/openstack/nova/blob/master/nova/scheduler/filters/numa_topology_filter.py#L65\n\n[2] https://github.com/openstack/nova/blob/master/nova/objects/request_spec.py#L390","commit_id":"7ec98e52d676bf2aba54517621aa3904cb54ac03"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b33579b58679650fb5a19044fa2867ee0386c4f9","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        # scheduler.utils methods use directly the NovaObject."},{"line_number":52,"context_line":"        self.request_spec \u003d objects.RequestSpec.from_components("},{"line_number":53,"context_line":"            self.context, self.instance.uuid, image,"},{"line_number":54,"context_line":"            self.instance.flavor, request_numa_topology,"},{"line_number":55,"context_line":"            self.instance.pci_requests, legacy_props, None,"},{"line_number":56,"context_line":"            self.instance.availability_zone)"},{"line_number":57,"context_line":"        # NOTE(sbauza): Force_hosts/nodes needs to be reset"}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_7163311b","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":32},"in_reply_to":"bacf61ea_a4ce2658","updated":"2016-07-28 13:34:24.000000000","message":"@Sylvain I think lioxili and Yingxin are right - your fix makes sure the scheduler gets the new flavor, but the numa filter uses the numa topology from the request spec directly, so it\u0027s good that this patch makes sure that the filter gets the updated numa topology.","commit_id":"7ec98e52d676bf2aba54517621aa3904cb54ac03"},{"author":{"_account_id":17288,"name":"liuxiuli","email":"liu.lixiu@zte.com.cn","username":"liu-lixiu"},"change_message_id":"ceab39a1e6d02289103d0b74ac87fb141bd05df5","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        # scheduler.utils methods use directly the NovaObject."},{"line_number":52,"context_line":"        self.request_spec \u003d objects.RequestSpec.from_components("},{"line_number":53,"context_line":"            self.context, self.instance.uuid, image,"},{"line_number":54,"context_line":"            self.instance.flavor, request_numa_topology,"},{"line_number":55,"context_line":"            self.instance.pci_requests, legacy_props, None,"},{"line_number":56,"context_line":"            self.instance.availability_zone)"},{"line_number":57,"context_line":"        # NOTE(sbauza): Force_hosts/nodes needs to be reset"}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_50b447f1","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":32},"in_reply_to":"bacf61ea_f7f2aa05","updated":"2016-07-28 00:29:07.000000000","message":"I saw your modification to the bug(347387). I think your modification is suitable for most filters, but only modify flavor is not suitable, because request_numa_topology is gotten by spec_obj.numa_topology but not gotten by flavor and image in NUMATopologyFilter.","commit_id":"7ec98e52d676bf2aba54517621aa3904cb54ac03"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"ac91c60319e64b5f33b40a4aa4cf0cd4d80d8f67","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                                             legacy_props)"},{"line_number":46,"context_line":"        scheduler_utils.populate_retry(legacy_props,"},{"line_number":47,"context_line":"                                       self.instance.uuid)"},{"line_number":48,"context_line":"        request_numa_topology \u003d\\"},{"line_number":49,"context_line":"            hardware.numa_get_constraints(self.flavor, image)"},{"line_number":50,"context_line":"        # TODO(sbauza): Remove that RequestSpec rehydratation once"},{"line_number":51,"context_line":"        # scheduler.utils methods use directly the NovaObject."}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_75e1cb29","line":48,"range":{"start_line":48,"start_character":31,"end_line":48,"end_character":32},"updated":"2016-09-02 10:19:13.000000000","message":"Can\u0027t we escape backslash here? Maybe with brackets or other name","commit_id":"838fe1b69660458dae1401521e3db7fdc81b9fdc"},{"author":{"_account_id":17288,"name":"liuxiuli","email":"liu.lixiu@zte.com.cn","username":"liu-lixiu"},"change_message_id":"76c68f69617ac5ada9e0bd2cff26f26b279d31c0","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                                             legacy_props)"},{"line_number":46,"context_line":"        scheduler_utils.populate_retry(legacy_props,"},{"line_number":47,"context_line":"                                       self.instance.uuid)"},{"line_number":48,"context_line":"        request_numa_topology \u003d\\"},{"line_number":49,"context_line":"            hardware.numa_get_constraints(self.flavor, image)"},{"line_number":50,"context_line":"        # TODO(sbauza): Remove that RequestSpec rehydratation once"},{"line_number":51,"context_line":"        # scheduler.utils methods use directly the NovaObject."}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_ab87725f","line":48,"range":{"start_line":48,"start_character":31,"end_line":48,"end_character":32},"in_reply_to":"fa7ab95a_75e1cb29","updated":"2016-09-02 10:57:20.000000000","message":"Thanks! I can fix it.","commit_id":"838fe1b69660458dae1401521e3db7fdc81b9fdc"}],"nova/tests/unit/conductor/tasks/test_migrate.py":[{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"5739cd8c2a2c2ee73dd378eb8ba68564e6fdaf9d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            system_metadata\u003d{\u0027image_hw_disk_bus\u0027: \u0027scsi\u0027})"},{"line_number":42,"context_line":"        self.instance \u003d objects.Instance._from_db_object("},{"line_number":43,"context_line":"            self.context, inst_object, inst, [])"},{"line_number":44,"context_line":"        self.request_spec \u003d objects.RequestSpec(image\u003dobjects.ImageMeta())"},{"line_number":45,"context_line":"        self.hosts \u003d [dict(host\u003d\u0027host1\u0027, nodename\u003dNone, limits\u003d{})]"},{"line_number":46,"context_line":"        self.filter_properties \u003d {\u0027limits\u0027: {}, \u0027retry\u0027: {\u0027num_attempts\u0027: 1,"},{"line_number":47,"context_line":"                                  \u0027hosts\u0027: [[\u0027host1\u0027, None]]}}"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_7c06251d","line":44,"range":{"start_line":44,"start_character":48,"end_line":44,"end_character":73},"updated":"2016-07-26 02:22:47.000000000","message":"It is not necessary to mock numa_get_constraints @58 and @88, the main problem is this ImageMeta object doesn\u0027t have properties.\n\nAlso see the comments at:\nhttps://review.openstack.org/#/c/340270/6/nova/tests/unit/conductor/test_conductor.py@1666","commit_id":"36213e22c82a86bb09acfe97e0177a525373ec5c"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"5739cd8c2a2c2ee73dd378eb8ba68564e6fdaf9d","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    @mock.patch.object(scheduler_client.SchedulerClient, \u0027select_destinations\u0027)"},{"line_number":92,"context_line":"    @mock.patch.object(compute_rpcapi.ComputeAPI, \u0027prep_resize\u0027)"},{"line_number":93,"context_line":"    @mock.patch.object(objects.Quotas, \u0027from_reservations\u0027)"},{"line_number":94,"context_line":"    def test_execute_with_modify_numa_topology(self, quotas_mock,"},{"line_number":95,"context_line":"                                               prep_resize_mock,"},{"line_number":96,"context_line":"                                               sel_dest_mock, sig_mock,"},{"line_number":97,"context_line":"                                               request_spec_from_components,"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_d97be3bc","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":46},"updated":"2016-07-26 02:22:47.000000000","message":"I don\u0027t think this test works, because it still passes after I revert the changes in \"nova/conductor/tasks/migrate.py\".","commit_id":"36213e22c82a86bb09acfe97e0177a525373ec5c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"6a17076f0b3ce2cd0a03f5beadbff8e1607057a5","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                                     self.request_spec, self.reservations,"},{"line_number":102,"context_line":"                                     self.clean_shutdown,"},{"line_number":103,"context_line":"                                     compute_rpcapi.ComputeAPI(),"},{"line_number":104,"context_line":"                                     scheduler_client.SchedulerClient())"},{"line_number":105,"context_line":"        numa_topology \u003d hardware.numa_get_constraints(flavor,"},{"line_number":106,"context_line":"                                                      self.request_spec.image)"},{"line_number":107,"context_line":"        request_spec \u003d self.request_spec"}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_19940e89","line":104,"updated":"2016-07-27 10:16:45.000000000","message":"This can be made cleaner by setting extra_specs on self.flavor, thus being able to use the existing self._generate_task() instead of \"manually\" creating a MigrationTask.","commit_id":"7ec98e52d676bf2aba54517621aa3904cb54ac03"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"6a17076f0b3ce2cd0a03f5beadbff8e1607057a5","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                                            instance\u003dself.instance)"},{"line_number":116,"context_line":"        sig_mock.assert_called_once_with(self.context, legacy_request_spec,"},{"line_number":117,"context_line":"                                         self.filter_properties)"},{"line_number":118,"context_line":"        self.assertEqual("},{"line_number":119,"context_line":"            len(list(request_spec_from_components.call_args[0])[4].cells),"},{"line_number":120,"context_line":"            len(numa_topology.cells))"},{"line_number":121,"context_line":"        task.scheduler_client.select_destinations.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_eff16802","line":118,"updated":"2016-07-27 10:16:45.000000000","message":"It\u0027d be better to do:\n\nself.assertEqual(request_spec_from_components.call_args[0][4].obj_to_primitive(), numa_topology.obj_to_primitive())\n\nIt makes it clearer what you\u0027re asserting is equal, and it compares the entire NUMA topology, not just the length of the cells.","commit_id":"7ec98e52d676bf2aba54517621aa3904cb54ac03"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b0802e58f40cab73ffd5e1e296d362d84edd80cc","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                                               sel_dest_mock, sig_mock,"},{"line_number":96,"context_line":"                                               request_spec_from_components):"},{"line_number":97,"context_line":"        sel_dest_mock.return_value \u003d self.hosts"},{"line_number":98,"context_line":"        self.flavor \u003d self.instance.flavor"},{"line_number":99,"context_line":"        self.flavor.extra_specs[\"hw:numa_nodes\"] \u003d 1"},{"line_number":100,"context_line":"        task \u003d self._generate_task()"},{"line_number":101,"context_line":"        numa_topology \u003d hardware.numa_get_constraints(self.flavor,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_31f259d3","line":98,"updated":"2016-07-28 13:33:47.000000000","message":"This line isn\u0027t actually needed now, as self.instance is already created with self.flavor [1]\n\n[1] https://review.openstack.org/#/c/340270/7..8/nova/tests/unit/conductor/tasks/test_migrate.py@33","commit_id":"d3ee8dd2fdaafb9c920c70de3691e3c13036d5da"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"ac91c60319e64b5f33b40a4aa4cf0cd4d80d8f67","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                                               sel_dest_mock, sig_mock,"},{"line_number":103,"context_line":"                                               request_spec_from_components):"},{"line_number":104,"context_line":"        sel_dest_mock.return_value \u003d self.hosts"},{"line_number":105,"context_line":"        self.flavor.extra_specs[\"hw:numa_nodes\"] \u003d 1"},{"line_number":106,"context_line":"        task \u003d self._generate_task()"},{"line_number":107,"context_line":"        numa_topology \u003d hardware.numa_get_constraints(self.flavor,"},{"line_number":108,"context_line":"                                                      self.request_spec.image)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_35ad83e9","line":105,"updated":"2016-09-02 10:19:13.000000000","message":"Doesn\u0027t it hurt \u0027self.flavor\u0027? Maybe we should copy it to some local variable","commit_id":"838fe1b69660458dae1401521e3db7fdc81b9fdc"},{"author":{"_account_id":17288,"name":"liuxiuli","email":"liu.lixiu@zte.com.cn","username":"liu-lixiu"},"change_message_id":"76c68f69617ac5ada9e0bd2cff26f26b279d31c0","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                                               sel_dest_mock, sig_mock,"},{"line_number":103,"context_line":"                                               request_spec_from_components):"},{"line_number":104,"context_line":"        sel_dest_mock.return_value \u003d self.hosts"},{"line_number":105,"context_line":"        self.flavor.extra_specs[\"hw:numa_nodes\"] \u003d 1"},{"line_number":106,"context_line":"        task \u003d self._generate_task()"},{"line_number":107,"context_line":"        numa_topology \u003d hardware.numa_get_constraints(self.flavor,"},{"line_number":108,"context_line":"                                                      self.request_spec.image)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_eba6da0d","line":105,"in_reply_to":"fa7ab95a_35ad83e9","updated":"2016-09-02 10:57:20.000000000","message":"Yes, it can hurt self.flavor. I use self.flavor so that I can use self._generate_task() directly. And I should save self.flavor.extra_specs first and then restore it after this test. I will fix it.","commit_id":"838fe1b69660458dae1401521e3db7fdc81b9fdc"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"99c04a4c998eddced51971c4289df3eae0f0069c","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                                               request_spec_from_components):"},{"line_number":104,"context_line":"        sel_dest_mock.return_value \u003d self.hosts"},{"line_number":105,"context_line":"        # save self.flavor\u0027s origin extra_specs"},{"line_number":106,"context_line":"        flavor_origin_extra_specs \u003d self.flavor.extra_specs"},{"line_number":107,"context_line":"        self.flavor.extra_specs[\"hw:numa_nodes\"] \u003d 1"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        task \u003d self._generate_task()"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a95cdbc_b02ec2a2","line":106,"updated":"2016-10-10 12:09:58.000000000","message":"I still think that you here the original value here, e.g. check this code for dicts class:\n    \n    d1 \u003d dict()\n    d1[\u0027a\u0027] \u003d 1\n    d1[\u0027b\u0027] \u003d 2\n    d2 \u003d d1\n    d1[\u0027a\u0027] \u003d 10\n    print d1\n    print d2\n    # they are the same\n\nI think you should use copy.deepcopy() here","commit_id":"5ea0baa98e47704337dd9eee9d0eff69dbe08b13"}],"nova/tests/unit/conductor/test_conductor.py":[{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"5739cd8c2a2c2ee73dd378eb8ba68564e6fdaf9d","unresolved":false,"context_lines":[{"line_number":1459,"context_line":"        self.conductor._set_vm_state_and_notify("},{"line_number":1460,"context_line":"                self.context, 1, \u0027method\u0027, \u0027updates\u0027, \u0027ex\u0027, \u0027request_spec\u0027)"},{"line_number":1461,"context_line":""},{"line_number":1462,"context_line":"    @mock.patch.object(hardware, \u0027numa_get_constraints\u0027)"},{"line_number":1463,"context_line":"    @mock.patch.object(scheduler_utils, \u0027setup_instance_group\u0027)"},{"line_number":1464,"context_line":"    @mock.patch.object(utils, \u0027get_image_from_system_metadata\u0027)"},{"line_number":1465,"context_line":"    @mock.patch.object(objects.Quotas, \u0027from_reservations\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_19e3bbda","line":1462,"updated":"2016-07-26 02:22:47.000000000","message":"This mock is not necessary, see @1666","commit_id":"36213e22c82a86bb09acfe97e0177a525373ec5c"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"5739cd8c2a2c2ee73dd378eb8ba68564e6fdaf9d","unresolved":false,"context_lines":[{"line_number":1484,"context_line":"            numa_topology\u003dNone)"},{"line_number":1485,"context_line":"        resvs \u003d \u0027fake-resvs\u0027"},{"line_number":1486,"context_line":"        image \u003d \u0027fake-image\u0027"},{"line_number":1487,"context_line":"        numa_topology \u003d objects.InstanceNUMATopology("},{"line_number":1488,"context_line":"            cells\u003d[objects.InstanceNUMACell()])"},{"line_number":1489,"context_line":"        numa_constraints_mock.return_value \u003d numa_topology"},{"line_number":1490,"context_line":""},{"line_number":1491,"context_line":"        fake_spec \u003d objects.RequestSpec(image\u003dobjects.ImageMeta())"},{"line_number":1492,"context_line":"        legacy_request_spec \u003d fake_spec.to_legacy_request_spec_dict()"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_39de7f11","line":1489,"range":{"start_line":1487,"start_character":8,"end_line":1489,"end_character":58},"updated":"2016-07-26 02:22:47.000000000","message":"This is not necessary, see @1666","commit_id":"36213e22c82a86bb09acfe97e0177a525373ec5c"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"5739cd8c2a2c2ee73dd378eb8ba68564e6fdaf9d","unresolved":false,"context_lines":[{"line_number":1515,"context_line":"                                              exc_info, legacy_request_spec)"},{"line_number":1516,"context_line":"        rollback_mock.assert_called_once_with()"},{"line_number":1517,"context_line":""},{"line_number":1518,"context_line":"    @mock.patch.object(hardware, \u0027numa_get_constraints\u0027)"},{"line_number":1519,"context_line":"    @mock.patch.object(scheduler_utils, \u0027setup_instance_group\u0027)"},{"line_number":1520,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027from_components\u0027)"},{"line_number":1521,"context_line":"    @mock.patch.object(utils, \u0027get_image_from_system_metadata\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_59dff339","line":1518,"updated":"2016-07-26 02:22:47.000000000","message":"This mock is not necessary, see @1666","commit_id":"36213e22c82a86bb09acfe97e0177a525373ec5c"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"5739cd8c2a2c2ee73dd378eb8ba68564e6fdaf9d","unresolved":false,"context_lines":[{"line_number":1635,"context_line":"                                            \u0027migrate_server\u0027, updates,"},{"line_number":1636,"context_line":"                                            exception, legacy_request_spec)"},{"line_number":1637,"context_line":""},{"line_number":1638,"context_line":"    @mock.patch.object(hardware, \u0027numa_get_constraints\u0027)"},{"line_number":1639,"context_line":"    @mock.patch.object(scheduler_utils, \u0027setup_instance_group\u0027)"},{"line_number":1640,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027from_components\u0027)"},{"line_number":1641,"context_line":"    @mock.patch.object(utils, \u0027get_image_from_system_metadata\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_99f7abd2","line":1638,"updated":"2016-07-26 02:22:47.000000000","message":"This mock is not necessary, see @1666","commit_id":"36213e22c82a86bb09acfe97e0177a525373ec5c"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"5739cd8c2a2c2ee73dd378eb8ba68564e6fdaf9d","unresolved":false,"context_lines":[{"line_number":1663,"context_line":"            numa_topology\u003dNone)"},{"line_number":1664,"context_line":"        image \u003d \u0027fake-image\u0027"},{"line_number":1665,"context_line":"        resvs \u003d \u0027fake-resvs\u0027"},{"line_number":1666,"context_line":"        fake_spec \u003d objects.RequestSpec(image\u003dobjects.ImageMeta())"},{"line_number":1667,"context_line":"        legacy_request_spec \u003d fake_spec.to_legacy_request_spec_dict()"},{"line_number":1668,"context_line":"        spec_fc_mock.return_value \u003d fake_spec"},{"line_number":1669,"context_line":"        numa_topology \u003d objects.InstanceNUMATopology()"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_b9738f7f","line":1666,"range":{"start_line":1666,"start_character":46,"end_line":1666,"end_character":65},"updated":"2016-07-26 02:22:47.000000000","message":"The correct ImageMeta should contain a ImageMetaProps object:\n    objects.ImageMeta(properties\u003dobjects.ImageMetaProps())\n\nThen all mocks of `hardware.numa_get_constrains` are unnecessary.","commit_id":"36213e22c82a86bb09acfe97e0177a525373ec5c"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"5739cd8c2a2c2ee73dd378eb8ba68564e6fdaf9d","unresolved":false,"context_lines":[{"line_number":1666,"context_line":"        fake_spec \u003d objects.RequestSpec(image\u003dobjects.ImageMeta())"},{"line_number":1667,"context_line":"        legacy_request_spec \u003d fake_spec.to_legacy_request_spec_dict()"},{"line_number":1668,"context_line":"        spec_fc_mock.return_value \u003d fake_spec"},{"line_number":1669,"context_line":"        numa_topology \u003d objects.InstanceNUMATopology()"},{"line_number":1670,"context_line":"        spec_fc_mock.numa_topology \u003d numa_topology"},{"line_number":1671,"context_line":""},{"line_number":1672,"context_line":"        hosts \u003d [dict(host\u003d\u0027host1\u0027, nodename\u003dNone, limits\u003d{})]"},{"line_number":1673,"context_line":"        metadata_mock.return_value \u003d image"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_19d61b4f","line":1670,"range":{"start_line":1669,"start_character":0,"end_line":1670,"end_character":50},"updated":"2016-07-26 02:22:47.000000000","message":"I don\u0027t think these two lines are needed.","commit_id":"36213e22c82a86bb09acfe97e0177a525373ec5c"}]}
