)]}'
{"nova/objects/numa.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"03cd0e65fc2be3d1417461c56dc7ba38d7354692","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":53,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":54,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":55,"context_line":"        \u0027networks\u0027: fields.ObjectField(\u0027NUMANetworkTopology\u0027),"},{"line_number":56,"context_line":"        }"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __eq__(self, other):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_c69f9563","line":55,"range":{"start_line":55,"start_character":7,"end_line":55,"end_character":62},"updated":"2018-04-27 12:28:13.000000000","message":"actully since networks can span numa nodes i think this is at the wrong level.","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0d05ee2ebe3ba3030e48fecec5c3c9e738d30799","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":53,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":54,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":55,"context_line":"        \u0027networks\u0027: fields.ObjectField(\u0027NUMANetworkTopology\u0027),"},{"line_number":56,"context_line":"        }"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __eq__(self, other):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_7183dd05","line":55,"range":{"start_line":55,"start_character":7,"end_line":55,"end_character":62},"in_reply_to":"9f6a8fd7_c69f9563","updated":"2018-05-04 12:59:45.000000000","message":"Based on the discussion below [1], I think this is actually correct\n\n[1] https://review.openstack.org/#/c/564439/1/nova/objects/numa.py@166","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"0c3929cc92b23e99bb2f3902e074544fcacdb44b","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":158,"context_line":"class NUMANetworkTopology(base.NovaObject):"},{"line_number":159,"context_line":"    # Version 1.0: Initial version"},{"line_number":160,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_4ca89bda","line":158,"range":{"start_line":158,"start_character":6,"end_line":158,"end_character":10},"updated":"2018-04-26 15:01:22.000000000","message":"I would separate this entire object out into its own file and call it just NetworkProvider. NUMA is only partially-related to what is being represented here, which is the list of physical networks that are connected to the provider of network connectivity.","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d1085b8b67b5d198b7d6e4fa6fca98b6241ddfae","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":158,"context_line":"class NUMANetworkTopology(base.NovaObject):"},{"line_number":159,"context_line":"    # Version 1.0: Initial version"},{"line_number":160,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_7cb416f3","line":158,"range":{"start_line":158,"start_character":6,"end_line":158,"end_character":10},"in_reply_to":"9f6a8fd7_4ca89bda","updated":"2018-04-27 14:00:30.000000000","message":"\u003e I would separate this entire object out into its own file\n \u003e and call it just NetworkProvider.\n\nWhat use is this information without the NUMA aspect though? All I\u0027m trying to do here is map those configuration options to the NUMA* objects.\n\n \u003e NUMA is only partially-related to what is being represented\n \u003e here, which is the list of physical networks that are\n \u003e connected to the provider of network connectivity.\n\nWhat do you mean by \"provider of network connectivity\"?","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"55d459dc42776d7d4267593e2788a6bed54a4194","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":158,"context_line":"class NUMANetworkTopology(base.NovaObject):"},{"line_number":159,"context_line":"    # Version 1.0: Initial version"},{"line_number":160,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_a0bffbce","line":158,"range":{"start_line":158,"start_character":6,"end_line":158,"end_character":10},"in_reply_to":"9f6a8fd7_4ca89bda","updated":"2018-04-26 15:54:53.000000000","message":"We already have a nova.objects.network module that IMHO is good for that. It\u0027s not only for nova-net usage, see where the NetworkRequest objects are used.","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"953cc90ebe0fb3693f055b0c06e9f84605f87241","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":158,"context_line":"class NUMANetworkTopology(base.NovaObject):"},{"line_number":159,"context_line":"    # Version 1.0: Initial version"},{"line_number":160,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_51c00151","line":158,"range":{"start_line":158,"start_character":6,"end_line":158,"end_character":10},"in_reply_to":"9f6a8fd7_7cb416f3","updated":"2018-04-30 09:31:27.000000000","message":"if we called it network provider i guess we could extend the class with bandwitdh info to allow it to be reused with the network bandwith based scheduleing spec.  without that intersect however i dont think factoring this out gives you much excpet reducing the size of this file.","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f721e0a4ec2e283609716608ba09bb19c1dd57a0","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    fields \u003d {"},{"line_number":163,"context_line":"        \u0027physnets\u0027: fields.ListOfStringsField(),"},{"line_number":164,"context_line":"        # neutron only supports a single tunnel provider per host"},{"line_number":165,"context_line":"        \u0027tunnel\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_0bfcb63c","line":164,"range":{"start_line":164,"start_character":57,"end_line":164,"end_character":65},"updated":"2018-04-27 12:00:12.000000000","message":"actully its per network backend per host.\nbut in pratice its per host, however this is rather acadmeic as mixed neutron backend are rare and mix on a single host bar sriov is all but unheard of in any real deployments.\n\ntunnel providers must bind to an ip address typically on a spcific tcp/udp port so multiple backend cannot share the same ip.\n\nneutron does not provide a way for nova to support multiple tunnel endpoint on a single host for numa affinity usecases as it simply does not expose the required info via its rest api to allow use to handle that case. \n\nif that changes in the future we could look to extend this object from a boolean field to a list of network backends its a tunnel provider for however i think its better to cross that bridge when we come to it then try and support a usecase that is not needed today.","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"55d459dc42776d7d4267593e2788a6bed54a4194","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    fields \u003d {"},{"line_number":163,"context_line":"        \u0027physnets\u0027: fields.ListOfStringsField(),"},{"line_number":164,"context_line":"        # neutron only supports a single tunnel provider per host"},{"line_number":165,"context_line":"        \u0027tunnel\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_007ca71e","line":164,"updated":"2018-04-26 15:54:53.000000000","message":"what if neutron suddently supports more than one ?","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9b45d2c41406f478278ff413a1694c78ae452199","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    fields \u003d {"},{"line_number":163,"context_line":"        \u0027physnets\u0027: fields.ListOfStringsField(),"},{"line_number":164,"context_line":"        # neutron only supports a single tunnel provider per host"},{"line_number":165,"context_line":"        \u0027tunnel\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_6bff7234","line":164,"in_reply_to":"9f6a8fd7_007ca71e","updated":"2018-04-27 12:09:57.000000000","message":"Then I guess more than one NUMACell object will point to a NUMANetworkTopology object having tunnel\u003dTrue set","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"03cd0e65fc2be3d1417461c56dc7ba38d7354692","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    fields \u003d {"},{"line_number":163,"context_line":"        \u0027physnets\u0027: fields.ListOfStringsField(),"},{"line_number":164,"context_line":"        # neutron only supports a single tunnel provider per host"},{"line_number":165,"context_line":"        \u0027tunnel\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_86a99d91","line":164,"in_reply_to":"9f6a8fd7_6bff7234","updated":"2018-04-27 12:28:13.000000000","message":"only if the tunnel provider spans numa nodes such as when a tunnel endpoint ip is assigned to a cross numa bond.\n\nif the tunnel endpoint is associated with a singel nic on numa cell 0 then only cell 0 would need to refer to this elememnt.","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9b45d2c41406f478278ff413a1694c78ae452199","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        \u0027physnets\u0027: fields.ListOfStringsField(),"},{"line_number":164,"context_line":"        # neutron only supports a single tunnel provider per host"},{"line_number":165,"context_line":"        \u0027tunnel\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_abbb4a70","line":166,"updated":"2018-04-27 12:09:57.000000000","message":"Do I understand correctly that a NUMANetworkTopology instance connected to a NUMACell describes what physnets are affined to a given NUMACell as well as describing if a tunneling backend is affined to this NUMACell?","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d1085b8b67b5d198b7d6e4fa6fca98b6241ddfae","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        \u0027physnets\u0027: fields.ListOfStringsField(),"},{"line_number":164,"context_line":"        # neutron only supports a single tunnel provider per host"},{"line_number":165,"context_line":"        \u0027tunnel\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_bcb62edc","line":166,"in_reply_to":"9f6a8fd7_2673f14f","updated":"2018-04-27 14:00:30.000000000","message":"\u003e Do I understand correctly that a NUMANetworkTopology instance\n \u003e connected to a NUMACell describes what physnets are affined to a\n \u003e given NUMACell as well as describing if a tunneling backend is\n \u003e affined to this NUMACell?\n\nThat\u0027s the idea, yes.\n\n \u003e i think the relationship is inverted. the NUMANetworkTopology\n \u003e object should be in the main\n \u003e NUMATopology object and the indivigual network providers should\n \u003e probably reference the numa cells that they are affinitesed to\n \u003e since a network can span numanodes.\n\nYou _could_ do it that way, but it seemed more complicated. What I\u0027ve done here is essentially denormalization. If a physnet is associated with multiple NUMA nodes, then the physnet will be duplicated in multiple NUMANetworkTopology objects, e.g.\n\n  [neutron_physnet_foo]\n  numa_nodes \u003d 0, 1\n\n  [neutron_physnet_bar]\n  numa_nodes \u003d 1\n\n  \u003e\u003e\u003e print(topology.cells[0].networks.physnets)\n  [\u0027foo\u0027]\n  \u003e\u003e\u003e print(topology.cells[1].networks.physnets)\n  [\u0027foo\u0027, \u0027bar\u0027]\n\nDitto for tunnels. This seemed sensible to me, given that physnets are arbitrary tags.","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"03cd0e65fc2be3d1417461c56dc7ba38d7354692","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        \u0027physnets\u0027: fields.ListOfStringsField(),"},{"line_number":164,"context_line":"        # neutron only supports a single tunnel provider per host"},{"line_number":165,"context_line":"        \u0027tunnel\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_2673f14f","line":166,"in_reply_to":"9f6a8fd7_abbb4a70","updated":"2018-04-27 12:28:13.000000000","message":"that i belive is stephens intent but that raises a good point.\n\ni think the relationship is inverted. the NUMANetworkTopology object should be in the main \nNUMATopology object and the indivigual network providers should probably reference the numa cells that they are affinitesed to since a network can span numanodes.","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"953cc90ebe0fb3693f055b0c06e9f84605f87241","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        \u0027physnets\u0027: fields.ListOfStringsField(),"},{"line_number":164,"context_line":"        # neutron only supports a single tunnel provider per host"},{"line_number":165,"context_line":"        \u0027tunnel\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_249aedc4","line":166,"in_reply_to":"9f6a8fd7_bcb62edc","updated":"2018-04-30 09:31:27.000000000","message":"this will work however it risks inconsistency and waste some memory since you have denormalised it at both the object level and the db level.\n\nif we had 2 additional tables\nnetwork_topologies and network_topology_mapping (cell-\u003enetwork_topology) that would bring this relationship\nback to third normal form at the db level.\n\ngiven the numa cells are only stored in the numa topology blob there is no easy way to join on a cell id so to be honest if we desire to do that  we would want to first renormalise the numa topology blob which is out of scope of this change.\n\nso yes i guess this construction is fine provided we do not add any mutable state such as bandwidth info to this in the future.\n\npost rocky perhaps we should spend the time to renomalise the numa topology blob. ill assume we keep the current form for the following patch reviews.","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"03cd0e65fc2be3d1417461c56dc7ba38d7354692","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    fields \u003d {"},{"line_number":218,"context_line":"        \u0027cells\u0027: fields.ListOfObjectsField(\u0027NUMACell\u0027),"},{"line_number":219,"context_line":"        }"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    @property"},{"line_number":222,"context_line":"    def has_threads(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_a6ae2196","line":219,"updated":"2018-04-27 12:28:13.000000000","message":"i think we should add the numanetwork topology here instead of in the cell.","commit_id":"11a5838fa7316a5e9191a49481c39e3d3656cd9b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a4f54390bd9dc41b216b976514bb7b27b70a153d","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":158,"context_line":"class NUMANetworkTopology(base.NovaObject):"},{"line_number":159,"context_line":"    # Version 1.0: Initial version"},{"line_number":160,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_0d600e01","line":158,"range":{"start_line":158,"start_character":6,"end_line":158,"end_character":25},"updated":"2018-05-08 19:45:21.000000000","message":"\"topology\" really isn\u0027t the appropriate term here, since this isn\u0027t describing a layout of things. That said, NUMAPagesTopology isn\u0027t a topology either. :( And you probably just copied that to here, so I understand why you probably named this NUMANetworkTopology.\n\nConsider calling the field \"network_info\" in the NUMACell definition and calling this object NUMANetworkInfo.","commit_id":"63a6d903dbf7b28f61c448f291efdeb933f3d741"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a6247f2d8870e2208002d33968f9ab510af3a115","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":158,"context_line":"class NUMANetworkTopology(base.NovaObject):"},{"line_number":159,"context_line":"    # Version 1.0: Initial version"},{"line_number":160,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_9ddbbe7a","line":158,"range":{"start_line":158,"start_character":6,"end_line":158,"end_character":25},"in_reply_to":"5f7c97a3_0d600e01","updated":"2018-05-10 15:53:18.000000000","message":"Done","commit_id":"63a6d903dbf7b28f61c448f291efdeb933f3d741"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e32721ff74615f86cadd67073153d1b3fd1de15e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def all_things_equal(obj_a, obj_b):"},{"line_number":25,"context_line":"    for name in obj_a.fields:"},{"line_number":26,"context_line":"        set_a \u003d name in obj_a"},{"line_number":27,"context_line":"        set_b \u003d name in obj_b"},{"line_number":28,"context_line":"        if set_a !\u003d set_b:"},{"line_number":29,"context_line":"            return False"},{"line_number":30,"context_line":"        elif not set_a:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_f865841e","line":27,"range":{"start_line":26,"start_character":8,"end_line":27,"end_character":29},"updated":"2018-06-05 14:35:15.000000000","message":"Unrelated cleanup, doesn\u0027t need to be in this change.","commit_id":"2218e8ebeed4a7e08fd0eaf4be89d2e52dd078b1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"67f762294ada9ab975f770e2924617eb28c7e97a","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def all_things_equal(obj_a, obj_b):"},{"line_number":25,"context_line":"    for name in obj_a.fields:"},{"line_number":26,"context_line":"        set_a \u003d name in obj_a"},{"line_number":27,"context_line":"        set_b \u003d name in obj_b"},{"line_number":28,"context_line":"        if set_a !\u003d set_b:"},{"line_number":29,"context_line":"            return False"},{"line_number":30,"context_line":"        elif not set_a:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_e9d4b821","line":27,"range":{"start_line":26,"start_character":8,"end_line":27,"end_character":29},"in_reply_to":"5f7c97a3_f865841e","updated":"2018-06-07 13:26:22.000000000","message":"I do need this, actually. I\u0027m changing something and without this, the tests fail. Need to get dansmith to explain why, I guess","commit_id":"2218e8ebeed4a7e08fd0eaf4be89d2e52dd078b1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e32721ff74615f86cadd67073153d1b3fd1de15e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":53,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":54,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":55,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":56,"context_line":"        }"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __eq__(self, other):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_5874b8d0","line":55,"updated":"2018-06-05 14:35:15.000000000","message":"You need an obj_make_compatible implementation in here to pop the attribute if down-leveling. I see that wasn\u0027t done for the 1.1 or 1.2 changes, not sure why.","commit_id":"2218e8ebeed4a7e08fd0eaf4be89d2e52dd078b1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"67f762294ada9ab975f770e2924617eb28c7e97a","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":53,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":54,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":55,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":56,"context_line":"        }"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __eq__(self, other):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_4954cc54","line":55,"in_reply_to":"5f7c97a3_5874b8d0","updated":"2018-06-07 13:26:22.000000000","message":"Done","commit_id":"2218e8ebeed4a7e08fd0eaf4be89d2e52dd078b1"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"cab864522b55899330b3ca3172931793d0e29b5c","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":53,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":54,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":55,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":56,"context_line":"        }"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __eq__(self, other):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_95498061","line":55,"in_reply_to":"5f7c97a3_5874b8d0","updated":"2018-06-07 13:10:55.000000000","message":"My thinking is that this object is referring the host it\u0027s not going to pass through any RPC and we does not support downgrading.","commit_id":"2218e8ebeed4a7e08fd0eaf4be89d2e52dd078b1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e32721ff74615f86cadd67073153d1b3fd1de15e","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    fields \u003d {"},{"line_number":163,"context_line":"        \u0027physnets\u0027: fields.ListOfStringsField(),"},{"line_number":164,"context_line":"        # neutron only supports a single tunnel provider per host"},{"line_number":165,"context_line":"        \u0027tunnel\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_38545c21","line":165,"range":{"start_line":165,"start_character":9,"end_line":165,"end_character":15},"updated":"2018-06-05 14:35:15.000000000","message":"tunneled?","commit_id":"2218e8ebeed4a7e08fd0eaf4be89d2e52dd078b1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"67f762294ada9ab975f770e2924617eb28c7e97a","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    fields \u003d {"},{"line_number":163,"context_line":"        \u0027physnets\u0027: fields.ListOfStringsField(),"},{"line_number":164,"context_line":"        # neutron only supports a single tunnel provider per host"},{"line_number":165,"context_line":"        \u0027tunnel\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_49d92cf2","line":165,"range":{"start_line":165,"start_character":9,"end_line":165,"end_character":15},"in_reply_to":"5f7c97a3_38545c21","updated":"2018-06-07 13:26:22.000000000","message":"Not sure. We\u0027re saying that there\u0027s a tunnel endpoint affined to this host NUMA node, not that all networks are tunneled. tunnel doesn\u0027t sound quite right but neither does tunneled.","commit_id":"2218e8ebeed4a7e08fd0eaf4be89d2e52dd078b1"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"8c64dcdc1649bea6a6a72c900a9a158aa35c8e18","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":55,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":56,"context_line":"        }"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":59,"context_line":"        super(NUMACell, self).obj_make_compatible(primitive, target_version)"},{"line_number":60,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":61,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":62,"context_line":"            primitive.pop(\u0027network_info\u0027, None)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def __eq__(self, other):"},{"line_number":65,"context_line":"        return all_things_equal(self, other)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_03e65617","line":62,"range":{"start_line":57,"start_character":0,"end_line":62,"end_character":47},"updated":"2018-06-11 14:07:54.000000000","message":"This will never be used. Do we really want to keep that code? Perhaps we could just add a comment here so future contributor understand the thing.","commit_id":"7415d8a5b02253cc0a9eb9818fa0b72fb4e52603"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"e905182631bb877515aa388d031ca4feffdbed4d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":56,"context_line":"        }"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":59,"context_line":"        super(NUMACell, self).obj_make_compatible(primitive, target_version)"},{"line_number":60,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":61,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":62,"context_line":"            primitive.pop(\u0027network_info\u0027, None)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def __eq__(self, other):"},{"line_number":65,"context_line":"        return all_things_equal(self, other)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_95305beb","line":62,"range":{"start_line":58,"start_character":0,"end_line":62,"end_character":47},"updated":"2018-06-11 15:29:06.000000000","message":"You did not take into account my previous comments. I guess that is because I did not voted :) ...What is the purpose of having this code since it will be never used. I would have just added a comment.?","commit_id":"00618a1072532e167d37f4a0fc7b7601e79e996d"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"5132ef484855598bd606e0efcac4b6c4b7b33c87","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":56,"context_line":"        }"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":59,"context_line":"        super(NUMACell, self).obj_make_compatible(primitive, target_version)"},{"line_number":60,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":61,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":62,"context_line":"            primitive.pop(\u0027network_info\u0027, None)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def __eq__(self, other):"},{"line_number":65,"context_line":"        return all_things_equal(self, other)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_f6dc27e2","line":62,"range":{"start_line":58,"start_character":0,"end_line":62,"end_character":47},"in_reply_to":"5f7c97a3_86c02f52","updated":"2018-06-12 07:48:41.000000000","message":"We are already storing this in database, but serialized in JSON. I don\u0027t see any evidence now to add this but if there is a preference.","commit_id":"00618a1072532e167d37f4a0fc7b7601e79e996d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"de1eb994278aa7b786b966f3178de615f5b1b6e2","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":56,"context_line":"        }"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":59,"context_line":"        super(NUMACell, self).obj_make_compatible(primitive, target_version)"},{"line_number":60,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":61,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":62,"context_line":"            primitive.pop(\u0027network_info\u0027, None)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def __eq__(self, other):"},{"line_number":65,"context_line":"        return all_things_equal(self, other)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_86c02f52","line":62,"range":{"start_line":58,"start_character":0,"end_line":62,"end_character":47},"in_reply_to":"5f7c97a3_95305beb","updated":"2018-06-11 17:29:42.000000000","message":"We\u0027re going to start storing this, which means we\u0027re going to start having to do this. It\u0027s unfortunate that we\u0027ve added fields to this and haven\u0027t done this in the past, as the minute we pass this over RPC or store it in the database, we\u0027d need it.\n\n+1 to just adding it and remaining strict to the pattern.","commit_id":"00618a1072532e167d37f4a0fc7b7601e79e996d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b6753d7d9c05f9db699137942749dc5363a9911f","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":56,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":57,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":58,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":59,"context_line":"        }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_5db50fec","line":58,"range":{"start_line":58,"start_character":9,"end_line":58,"end_character":21},"updated":"2018-06-22 10:48:58.000000000","message":"We could argue about the naming here as well if the network_info already a term in nova used for a different thing (e.g. network info cache).","commit_id":"7077443bb3ba31518e8f3426e58b59b68dd7a688"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"41596854138bfb7e95654f8ab8ae11ffe9ca2ed7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":56,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":57,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":58,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":59,"context_line":"        }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_9cc5c990","line":58,"range":{"start_line":58,"start_character":9,"end_line":58,"end_character":21},"in_reply_to":"5f7c97a3_356f07c5","updated":"2018-06-25 12:56:17.000000000","message":"maybe network_details","commit_id":"7077443bb3ba31518e8f3426e58b59b68dd7a688"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d694c5d9b998ddabe732a70a3d259d3ca8b26e0","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":56,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":57,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":58,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":59,"context_line":"        }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_356f07c5","line":58,"range":{"start_line":58,"start_character":9,"end_line":58,"end_character":21},"in_reply_to":"5f7c97a3_5db50fec","updated":"2018-06-22 15:07:37.000000000","message":"Indeed. I\u0027m open to suggestions here","commit_id":"7077443bb3ba31518e8f3426e58b59b68dd7a688"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"987310ad58a1bbda38f19b724633699b3d4a18fd","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":56,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":57,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":58,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":59,"context_line":"        }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_9dca906b","line":58,"range":{"start_line":58,"start_character":9,"end_line":58,"end_character":21},"in_reply_to":"5f7c97a3_9cc5c990","updated":"2018-06-26 08:21:33.000000000","message":"Yes agree. why don\u0027t just use \u0027network\u0027 or \u0027network_affinity\u0027","commit_id":"7077443bb3ba31518e8f3426e58b59b68dd7a688"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d39a939c66123ddec67472c55f894e93063d36b8","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova.virt import hardware"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def all_things_equal(obj_a, obj_b):"},{"line_number":25,"context_line":"    if obj_b is None:"},{"line_number":26,"context_line":"        return False"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    for name in obj_a.fields:"},{"line_number":29,"context_line":"        set_a \u003d name in obj_a"},{"line_number":30,"context_line":"        set_b \u003d name in obj_b"},{"line_number":31,"context_line":"        if set_a !\u003d set_b:"},{"line_number":32,"context_line":"            return False"},{"line_number":33,"context_line":"        elif not set_a:"},{"line_number":34,"context_line":"            continue"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        if getattr(obj_a, name) !\u003d getattr(obj_b, name):"},{"line_number":37,"context_line":"            return False"},{"line_number":38,"context_line":"    return True"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_e5df6209","line":38,"range":{"start_line":24,"start_character":0,"end_line":38,"end_character":15},"updated":"2018-06-26 14:35:35.000000000","message":"This is necessary because:\n\n\u003cmriedem\u003e stephenfin: that\u0027s because obj_attr_is_set looks for obj_fields\n\u003cmriedem\u003e http://git.openstack.org/cgit/openstack/oslo.versionedobjects/tree/oslo_versionedobjects/base.py#n681\n\u003cmriedem\u003e the \u0027in\u0027 implementation is a bit cleaner http://git.openstack.org/cgit/openstack/oslo.versionedobjects/tree/oslo_versionedobjects/base.py#n321\n\u003cmriedem\u003e but it hides that AttributeError","commit_id":"ffd2f38603f77380d514e39c52a570ba48cf7126"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d39a939c66123ddec67472c55f894e93063d36b8","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":56,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":57,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":58,"context_line":"        \u0027network_info\u0027: fields.ObjectField(\u0027NUMANetworkInfo\u0027),"},{"line_number":59,"context_line":"        }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_05d61ef3","line":58,"range":{"start_line":58,"start_character":60,"end_line":58,"end_character":62},"updated":"2018-06-26 14:35:35.000000000","message":"We\u0027re always going set this. However, because there could be legacy objects floating around, does this need to be nullable? Perhaps that would help the above too?","commit_id":"ffd2f38603f77380d514e39c52a570ba48cf7126"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c8c018abd9783463be05efc3629044048cf4292d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    # Version 1.0: Initial version"},{"line_number":44,"context_line":"    # Version 1.1: Added pinned_cpus and siblings fields"},{"line_number":45,"context_line":"    # Version 1.2: Added mempages field"},{"line_number":46,"context_line":"    # Version 1.3: Add network_info field"},{"line_number":47,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_46e65c18","line":46,"range":{"start_line":46,"start_character":23,"end_line":46,"end_character":35},"updated":"2018-06-26 16:15:55.000000000","message":"This is wrong now.","commit_id":"aebd2efe23bea795906733259936459b48a18436"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7ffe833a6accc286d8186d807bc72184e3a24b6a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":56,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":57,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":58,"context_line":"        \u0027network_affinity\u0027: fields.ObjectField(\u0027NUMANetworkAffinity\u0027),"},{"line_number":59,"context_line":"        }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_73bd4e66","line":58,"range":{"start_line":58,"start_character":9,"end_line":58,"end_character":25},"updated":"2018-06-27 06:01:29.000000000","message":"Oh so you accepted my suggestion, thanks :)","commit_id":"aebd2efe23bea795906733259936459b48a18436"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7ffe833a6accc286d8186d807bc72184e3a24b6a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        super(NUMACell, self).obj_make_compatible(primitive, target_version)"},{"line_number":63,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":64,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":65,"context_line":"            primitive.pop(\u0027network_info\u0027, None)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def __eq__(self, other):"},{"line_number":68,"context_line":"        return all_things_equal(self, other)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_b38d26d5","line":65,"updated":"2018-06-27 06:01:29.000000000","message":"You need to update that part as-well.","commit_id":"aebd2efe23bea795906733259936459b48a18436"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"926db2662675b9e6d4843d19c6b89058214091f2","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":56,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":57,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":58,"context_line":"        \u0027network_metadata\u0027: fields.ObjectField(\u0027NetworkMetadata\u0027),"},{"line_number":59,"context_line":"        }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_ccffc1fe","line":58,"range":{"start_line":58,"start_character":9,"end_line":58,"end_character":25},"updated":"2018-06-28 05:35:21.000000000","message":"finally you find an other one... like for network_info, that one is a bit confusing since we have some kind of network metadata thing with the metadata API.","commit_id":"f2cd9d004b71ff99b63aabbca3f6f3f337d3f85b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6549b23dfde9088cfef86bc93fcc7c72ecf0404c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027pinned_cpus\u0027: fields.SetOfIntegersField(),"},{"line_number":56,"context_line":"        \u0027siblings\u0027: fields.ListOfSetsOfIntegersField(),"},{"line_number":57,"context_line":"        \u0027mempages\u0027: fields.ListOfObjectsField(\u0027NUMAPagesTopology\u0027),"},{"line_number":58,"context_line":"        \u0027network_metadata\u0027: fields.ObjectField(\u0027NetworkMetadata\u0027),"},{"line_number":59,"context_line":"        }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_4c372ce6","line":58,"range":{"start_line":58,"start_character":9,"end_line":58,"end_character":25},"in_reply_to":"5f7c97a3_ccffc1fe","updated":"2018-06-28 09:53:14.000000000","message":"Heh, yeah, there\u0027s overlap with pretty much everything\u0027s that\u0027s been suggested. Still, open to ideas here","commit_id":"f2cd9d004b71ff99b63aabbca3f6f3f337d3f85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a18155aaf831d7b47112d928e12c411ca9002ca1","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        return False"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    for name in obj_a.fields:"},{"line_number":29,"context_line":"        set_a \u003d name in obj_a"},{"line_number":30,"context_line":"        set_b \u003d name in obj_b"},{"line_number":31,"context_line":"        if set_a !\u003d set_b:"},{"line_number":32,"context_line":"            return False"},{"line_number":33,"context_line":"        elif not set_a:"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_9cbe40ad","line":30,"range":{"start_line":29,"start_character":8,"end_line":30,"end_character":29},"updated":"2018-07-05 21:24:48.000000000","message":"This is unrelated, please keep stuff like this out of the series so it doesn\u0027t need to be any longer than needed.","commit_id":"d34d70c0a171d7dcc6d33d8c0a5684bb88ba9c7a"}],"nova/tests/unit/objects/test_numa.py":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7ffe833a6accc286d8186d807bc72184e3a24b6a","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        self.assertNotEqual(cell1, cell2)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def test_obj_make_compatible(self):"},{"line_number":207,"context_line":"        network_info \u003d objects.NUMANetworkAffinity(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027],"},{"line_number":208,"context_line":"                                                   tunneled\u003dTrue)"},{"line_number":209,"context_line":"        cell \u003d objects.NUMACell(id\u003d1, cpuset\u003dset([1, 2]), memory\u003d32,"},{"line_number":210,"context_line":"                                cpu_usage\u003d10, pinned_cpus\u003dset([3, 4]),"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_b3a68653","line":207,"range":{"start_line":207,"start_character":8,"end_line":207,"end_character":21},"updated":"2018-06-27 06:01:29.000000000","message":"Perhaps it would be better if you can rename this to network_affinity","commit_id":"aebd2efe23bea795906733259936459b48a18436"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7ffe833a6accc286d8186d807bc72184e3a24b6a","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        versions \u003d ovo_base.obj_tree_get_versions(\u0027NUMACell\u0027)"},{"line_number":215,"context_line":"        primitive \u003d cell.obj_to_primitive(target_version\u003d\u00271.3\u0027,"},{"line_number":216,"context_line":"                                          version_manifest\u003dversions)"},{"line_number":217,"context_line":"        self.assertIn(\u0027network_info\u0027, primitive[\u0027nova_object.data\u0027])"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        primitive \u003d cell.obj_to_primitive(target_version\u003d\u00271.2\u0027,"},{"line_number":220,"context_line":"                                          version_manifest\u003dversions)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_13ac1a33","line":217,"updated":"2018-06-27 06:01:29.000000000","message":"Hum... You forgot to update some parts of the test","commit_id":"aebd2efe23bea795906733259936459b48a18436"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7ffe833a6accc286d8186d807bc72184e3a24b6a","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        primitive \u003d cell.obj_to_primitive(target_version\u003d\u00271.2\u0027,"},{"line_number":220,"context_line":"                                          version_manifest\u003dversions)"},{"line_number":221,"context_line":"        self.assertNotIn(\u0027network_info\u0027, primitive[\u0027nova_object.data\u0027])"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def test_numa_cell_not_equivalent_missing_a(self):"},{"line_number":224,"context_line":"        cell1 \u003d objects.NUMACell(id\u003d1, cpuset\u003dset([1, 2]), memory\u003d32,"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_d3a1c23b","line":221,"updated":"2018-06-27 06:01:29.000000000","message":"ditto","commit_id":"aebd2efe23bea795906733259936459b48a18436"}]}
