)]}'
{"nova/objects/request_spec.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"66ac1cb50e0d4d5b4ca0c1d850ffae369b5419c0","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        \u0027security_groups\u0027: fields.ObjectField(\u0027SecurityGroupList\u0027),"},{"line_number":91,"context_line":"        \u0027network_metadata\u0027: fields.ObjectField(\u0027NetworkMetadata\u0027),"},{"line_number":92,"context_line":"        \u0027is_bfv\u0027: fields.BooleanField(),"},{"line_number":93,"context_line":"        # NOTE(gibi): Eventually we want to store every resource request as"},{"line_number":94,"context_line":"        # RequestGroup objects here. However currently the flavor based"},{"line_number":95,"context_line":"        # resources like vcpu, ram, disk, and flavor.extra_spec based resources"},{"line_number":96,"context_line":"        # are not handled this way. See the Todo in from_components() where"},{"line_number":97,"context_line":"        # requested_resources are set."},{"line_number":98,"context_line":"        \u0027requested_resources\u0027: fields.ListOfObjectsField(\u0027RequestGroup\u0027,"},{"line_number":99,"context_line":"                                                         nullable\u003dTrue,"},{"line_number":100,"context_line":"                                                         default\u003dNone)"},{"line_number":101,"context_line":"    }"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_4fc21636","line":100,"range":{"start_line":93,"start_character":8,"end_line":100,"end_character":70},"updated":"2019-04-10 13:32:40.000000000","message":"This is where RequestGroup gets into the RequestSpec.","commit_id":"c3e3eede0916fa21015c4403f38a5ff0ae107f0b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"66ac1cb50e0d4d5b4ca0c1d850ffae369b5419c0","unresolved":false,"context_lines":[{"line_number":603,"context_line":"                spec.instance_group.hosts \u003d None"},{"line_number":604,"context_line":"            # NOTE(mriedem): Don\u0027t persist retries, requested_destination,"},{"line_number":605,"context_line":"            # requested_resources or ignored hosts since those are per-request"},{"line_number":606,"context_line":"            for excluded in (\u0027retry\u0027, \u0027requested_destination\u0027,"},{"line_number":607,"context_line":"                             \u0027requested_resources\u0027, \u0027ignore_hosts\u0027):"},{"line_number":608,"context_line":"                if excluded in spec and getattr(spec, excluded):"},{"line_number":609,"context_line":"                    setattr(spec, excluded, None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_cfe366d7","line":606,"updated":"2019-04-10 13:32:40.000000000","message":"And this is where we *don\u0027t* persist the RequestGroup with the in_tree value.","commit_id":"c3e3eede0916fa21015c4403f38a5ff0ae107f0b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d7725a138a39b5a0c3f29c20b2017fb2814df736","unresolved":false,"context_lines":[{"line_number":603,"context_line":"                spec.instance_group.hosts \u003d None"},{"line_number":604,"context_line":"            # NOTE(mriedem): Don\u0027t persist retries, requested_destination,"},{"line_number":605,"context_line":"            # requested_resources or ignored hosts since those are per-request"},{"line_number":606,"context_line":"            for excluded in (\u0027retry\u0027, \u0027requested_destination\u0027,"},{"line_number":607,"context_line":"                             \u0027requested_resources\u0027, \u0027ignore_hosts\u0027):"},{"line_number":608,"context_line":"                if excluded in spec and getattr(spec, excluded):"},{"line_number":609,"context_line":"                    setattr(spec, excluded, None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fce034c_18474220","line":606,"in_reply_to":"3fce034c_27ab01d7","updated":"2019-04-11 13:33:44.000000000","message":"\u003e 1. putting force_hosts/force_nodes to this excluded list \n\nIt probably should be, force hosts/nodes is just a per-operation behavior as far as I\u0027m concerned given we have to call reset_forced_destination for every move operation. Sylvain might remember some reason why we need to persist it.\n\n\u003e 2. using requested_destination for any cases removing force_hosts/force_nodes\n\nIt\u0027s only used in two places, server create and rebuild with a new image, and I\u0027m trying to fix the latter here:\n\nhttps://review.openstack.org/#/c/650376/\n\nAs for server create it\u0027s a bit different since requested_destination is meant to go through the scheduler filters but force_hosts/nodes does not, so if we changed server create to use requested_destination it would be an API behavior change for server create, but that is being proposed here so we have both options:\n\nhttps://review.openstack.org/#/c/645458/","commit_id":"c3e3eede0916fa21015c4403f38a5ff0ae107f0b"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"17a6ffedd4fd200487869c1813acdade5f191654","unresolved":false,"context_lines":[{"line_number":603,"context_line":"                spec.instance_group.hosts \u003d None"},{"line_number":604,"context_line":"            # NOTE(mriedem): Don\u0027t persist retries, requested_destination,"},{"line_number":605,"context_line":"            # requested_resources or ignored hosts since those are per-request"},{"line_number":606,"context_line":"            for excluded in (\u0027retry\u0027, \u0027requested_destination\u0027,"},{"line_number":607,"context_line":"                             \u0027requested_resources\u0027, \u0027ignore_hosts\u0027):"},{"line_number":608,"context_line":"                if excluded in spec and getattr(spec, excluded):"},{"line_number":609,"context_line":"                    setattr(spec, excluded, None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fce034c_27ab01d7","line":606,"in_reply_to":"5fc1f717_cfe366d7","updated":"2019-04-11 12:42:39.000000000","message":"Thanks, what I still don\u0027t understand is what prevents us from\n\n1. putting force_hosts/force_nodes to this excluded list \n2. using requested_destination for any cases removing force_hosts/force_nodes","commit_id":"c3e3eede0916fa21015c4403f38a5ff0ae107f0b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"035866bdea9c21c007e45f727562e5d761195944","unresolved":false,"context_lines":[{"line_number":1056,"context_line":"        super(RequestGroup, self).obj_make_compatible("},{"line_number":1057,"context_line":"            primitive, target_version)"},{"line_number":1058,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":1059,"context_line":"        if target_version \u003c (1, 2):"},{"line_number":1060,"context_line":"            if \u0027in_tree\u0027 in primitive:"},{"line_number":1061,"context_line":"                del primitive[\u0027in_tree\u0027]"},{"line_number":1062,"context_line":"        if target_version \u003c (1, 1):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fce034c_9809f2de","line":1059,"updated":"2019-04-11 13:35:42.000000000","message":"We should probably have a unit test for this, something like this:\n\nhttps://github.com/openstack/nova/blob/3a6d48697feee02380d60beeaa81ef619f9c94e3/nova/tests/unit/objects/test_request_spec.py#L980","commit_id":"0d1310224818c204c52f67deee18efafd1269681"}],"nova/tests/unit/objects/test_request_spec.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"8cd60b93cc7d96e5c27a82377716bc90a2b19cd6","unresolved":false,"context_lines":[{"line_number":978,"context_line":"        self.assertEqual([], rg.aggregates)"},{"line_number":979,"context_line":"        self.assertEqual([], rg.provider_uuids)"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"    def test_compat_requester_and_provider_1_1(self):"},{"line_number":982,"context_line":"        req_obj \u003d objects.RequestGroup("},{"line_number":983,"context_line":"            requester_id\u003duuids.requester, provider_uuids\u003d[uuids.rp1],"},{"line_number":984,"context_line":"            required_traits\u003dset([\u0027CUSTOM_PHYSNET_2\u0027]))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_1f35a546","line":981,"range":{"start_line":981,"start_character":43,"end_line":981,"end_character":47},"updated":"2019-04-16 01:19:31.000000000","message":"The specified version is 1.0, why not 1_0 here?","commit_id":"02b26457f3c5773973f374f39e069d2a854e99f6"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"33ccd2ec107de13149d01753fe3aa5fc0bc51be0","unresolved":false,"context_lines":[{"line_number":978,"context_line":"        self.assertEqual([], rg.aggregates)"},{"line_number":979,"context_line":"        self.assertEqual([], rg.provider_uuids)"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"    def test_compat_requester_and_provider_1_1(self):"},{"line_number":982,"context_line":"        req_obj \u003d objects.RequestGroup("},{"line_number":983,"context_line":"            requester_id\u003duuids.requester, provider_uuids\u003d[uuids.rp1],"},{"line_number":984,"context_line":"            required_traits\u003dset([\u0027CUSTOM_PHYSNET_2\u0027]))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_5d11f2ab","line":981,"range":{"start_line":981,"start_character":43,"end_line":981,"end_character":47},"in_reply_to":"3fce034c_1f35a546","updated":"2019-04-16 09:25:12.000000000","message":"\u003e The specified version is 1.0, why not 1_0 here?\n\nI think this was renamed to 1_1 since he meant its the test that existed/was added for object version 1.1.\n\nHowever this test is now just a downgrade from 1.2 to 1.0 since we have bumped the version. ({\u0027RequestGroup\u0027: \u00271.2\u0027}). So I understand the confusion behind naming this 1_1 since we don\u0027t request a 1.1 versioned object to downgrade to 1.0.","commit_id":"02b26457f3c5773973f374f39e069d2a854e99f6"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"8cd60b93cc7d96e5c27a82377716bc90a2b19cd6","unresolved":false,"context_lines":[{"line_number":990,"context_line":"        self.assertNotIn(\u0027provider_uuids\u0027, primitive)"},{"line_number":991,"context_line":"        self.assertIn(\u0027required_traits\u0027, primitive)"},{"line_number":992,"context_line":""},{"line_number":993,"context_line":"    def test_compat_requester_and_provider_1_2(self):"},{"line_number":994,"context_line":"        req_obj \u003d objects.RequestGroup("},{"line_number":995,"context_line":"            requester_id\u003duuids.requester, provider_uuids\u003d[uuids.rp1],"},{"line_number":996,"context_line":"            required_traits\u003dset([\u0027CUSTOM_PHYSNET_2\u0027]),"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_3f38a13b","line":993,"range":{"start_line":993,"start_character":43,"end_line":993,"end_character":46},"updated":"2019-04-16 01:19:31.000000000","message":"ditto: 1_1","commit_id":"02b26457f3c5773973f374f39e069d2a854e99f6"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"33ccd2ec107de13149d01753fe3aa5fc0bc51be0","unresolved":false,"context_lines":[{"line_number":990,"context_line":"        self.assertNotIn(\u0027provider_uuids\u0027, primitive)"},{"line_number":991,"context_line":"        self.assertIn(\u0027required_traits\u0027, primitive)"},{"line_number":992,"context_line":""},{"line_number":993,"context_line":"    def test_compat_requester_and_provider_1_2(self):"},{"line_number":994,"context_line":"        req_obj \u003d objects.RequestGroup("},{"line_number":995,"context_line":"            requester_id\u003duuids.requester, provider_uuids\u003d[uuids.rp1],"},{"line_number":996,"context_line":"            required_traits\u003dset([\u0027CUSTOM_PHYSNET_2\u0027]),"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_fd0d3e3e","line":993,"range":{"start_line":993,"start_character":43,"end_line":993,"end_character":46},"in_reply_to":"3fce034c_3f38a13b","updated":"2019-04-16 09:25:12.000000000","message":"This is 1_2 since he is testing the new 1.2 version after adding the in_tree field and then downgrading it to 1.1.","commit_id":"02b26457f3c5773973f374f39e069d2a854e99f6"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"33ccd2ec107de13149d01753fe3aa5fc0bc51be0","unresolved":false,"context_lines":[{"line_number":994,"context_line":"        req_obj \u003d objects.RequestGroup("},{"line_number":995,"context_line":"            requester_id\u003duuids.requester, provider_uuids\u003d[uuids.rp1],"},{"line_number":996,"context_line":"            required_traits\u003dset([\u0027CUSTOM_PHYSNET_2\u0027]),"},{"line_number":997,"context_line":"            in_tree\u003duuids.rp2)"},{"line_number":998,"context_line":"        versions \u003d ovo_base.obj_tree_get_versions(\u0027RequestGroup\u0027)"},{"line_number":999,"context_line":"        primitive \u003d req_obj.obj_to_primitive("},{"line_number":1000,"context_line":"            target_version\u003d\u00271.1\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_4099096c","line":997,"range":{"start_line":997,"start_character":12,"end_line":997,"end_character":29},"updated":"2019-04-16 09:25:12.000000000","message":"this is not really needed right since the object would anyways have the \"in_tree\" field set to None by default? So I guess this test and the one above are same except the downgrading to versions 1.0 and 1.1 respectively (which is probably why the naming of the test seems confusing). Both these tests could have just been combined into one like here : https://github.com/openstack/nova/blob/013aa1915c79cfcb90c4333ce1e16b3c40f16be8/nova/tests/unit/objects/test_instance_mapping.py#L168","commit_id":"02b26457f3c5773973f374f39e069d2a854e99f6"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f40ec78e74891de400ddb2d4dae014ed163a0b3f","unresolved":false,"context_lines":[{"line_number":995,"context_line":"            requester_id\u003duuids.requester, provider_uuids\u003d[uuids.rp1],"},{"line_number":996,"context_line":"            required_traits\u003dset([\u0027CUSTOM_PHYSNET_2\u0027]),"},{"line_number":997,"context_line":"            in_tree\u003duuids.rp2)"},{"line_number":998,"context_line":"        versions \u003d ovo_base.obj_tree_get_versions(\u0027RequestGroup\u0027)"},{"line_number":999,"context_line":"        primitive \u003d req_obj.obj_to_primitive("},{"line_number":1000,"context_line":"            target_version\u003d\u00271.1\u0027,"},{"line_number":1001,"context_line":"            version_manifest\u003dversions)[\u0027nova_object.data\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_44904b4f","line":998,"updated":"2019-04-15 16:56:03.000000000","message":"Should we check that in_tree is there before we downgrade the object.\n\nMaybe not necessary since that\u0027s effectively confirming that python works, but it has a nice flow to it.","commit_id":"02b26457f3c5773973f374f39e069d2a854e99f6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a05f66dfd0a3971dfc45146e2db856b58876f9cf","unresolved":false,"context_lines":[{"line_number":986,"context_line":"        primitive \u003d req_obj.obj_to_primitive("},{"line_number":987,"context_line":"            target_version\u003d\u00271.2\u0027,"},{"line_number":988,"context_line":"            version_manifest\u003dversions)[\u0027nova_object.data\u0027]"},{"line_number":989,"context_line":"        self.assertIn(\u0027in_tree\u0027, primitive)"},{"line_number":990,"context_line":"        self.assertIn(\u0027requester_id\u0027, primitive)"},{"line_number":991,"context_line":"        self.assertIn(\u0027provider_uuids\u0027, primitive)"},{"line_number":992,"context_line":"        self.assertIn(\u0027required_traits\u0027, primitive)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fce034c_0118c7d0","line":989,"range":{"start_line":989,"start_character":8,"end_line":989,"end_character":43},"updated":"2019-04-17 13:19:14.000000000","message":"And this works because in_tree has a default value of None and is set by the __init__ method.","commit_id":"f6667b05d2146c928468021e5569a34215e93020"}]}
