)]}'
{"nova/tests/functional/test_servers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b830bac5827344a410b4ec5d399324131c59a447","unresolved":false,"context_lines":[{"line_number":1714,"context_line":"        self.assertNotIn(\u0027FOO\u0027, traits)"},{"line_number":1715,"context_line":""},{"line_number":1716,"context_line":""},{"line_number":1717,"context_line":"class TraitsTrackingTests(integrated_helpers.ProviderUsageBaseTestCase):"},{"line_number":1718,"context_line":"    compute_driver \u003d \u0027fake.SmallFakeDriver\u0027"},{"line_number":1719,"context_line":""},{"line_number":1720,"context_line":"    @mock.patch.object(fake.SmallFakeDriver, \u0027get_traits\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_8ae2bb9f","side":"PARENT","line":1717,"updated":"2018-06-19 21:20:42.000000000","message":"Ehh....can we at least implement update_provider_tree for the fake driver so that we can keep this test to make sure the resource tracker is reporting traits on behalf of the driver?\n\nMaybe that should be a change before this in the series?","commit_id":"afcf078715554e3efe5b71d583586dc112159299"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7cd66ce948779a58d3f949760487ddd6e801495f","unresolved":false,"context_lines":[{"line_number":1714,"context_line":"        self.assertNotIn(\u0027FOO\u0027, traits)"},{"line_number":1715,"context_line":""},{"line_number":1716,"context_line":""},{"line_number":1717,"context_line":"class TraitsTrackingTests(integrated_helpers.ProviderUsageBaseTestCase):"},{"line_number":1718,"context_line":"    compute_driver \u003d \u0027fake.SmallFakeDriver\u0027"},{"line_number":1719,"context_line":""},{"line_number":1720,"context_line":"    @mock.patch.object(fake.SmallFakeDriver, \u0027get_traits\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_552c4849","side":"PARENT","line":1717,"in_reply_to":"5f7c97a3_8ae2bb9f","updated":"2018-06-19 21:51:17.000000000","message":"I meant to comment before you busted me on this - it\u0027s covered quite thoroughly in the preceding test class, ProviderTreeTests.","commit_id":"afcf078715554e3efe5b71d583586dc112159299"}],"nova/tests/unit/compute/test_resource_tracker.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c95c1a4fa3ae35c023f76f2782eb619b41bd010e","unresolved":false,"context_lines":[{"line_number":1271,"context_line":"        \"\"\""},{"line_number":1272,"context_line":"        self._setup_rt()"},{"line_number":1273,"context_line":""},{"line_number":1274,"context_line":"        # Emulate a driver that has implemented the newish get_inventory() virt"},{"line_number":1275,"context_line":"        # driver method"},{"line_number":1276,"context_line":"        self.driver_mock.get_inventory.side_effect \u003d [mock.sentinel.inv_data]"},{"line_number":1277,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_5b61d710","line":1274,"range":{"start_line":1274,"start_character":52,"end_line":1274,"end_character":58},"updated":"2018-06-20 00:55:56.000000000","message":"heh, how times do change. :)","commit_id":"72efb4590762c375fc13d3b7446d70acc3f82173"}],"nova/virt/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b830bac5827344a410b4ec5d399324131c59a447","unresolved":false,"context_lines":[{"line_number":883,"context_line":"        \"\"\""},{"line_number":884,"context_line":"        raise NotImplementedError()"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":"    def get_traits(self, nodename):"},{"line_number":887,"context_line":"        \"\"\"Get the traits for a given node."},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"        Any custom traits returned are not required to exist in the placement"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_2a84c7d2","side":"PARENT","line":886,"range":{"start_line":886,"start_character":8,"end_line":886,"end_character":18},"updated":"2018-06-19 21:20:42.000000000","message":"Since you hammer me on this all the time, are you going to send something to the dev list about removing this virt driver interface? Having said that, I checked powervm, zvm and lxd drivers and none of them are using this.\n\nShould probably update the docs?:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/doc/source/reference/update-provider-tree.rst#n162","commit_id":"afcf078715554e3efe5b71d583586dc112159299"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7cd66ce948779a58d3f949760487ddd6e801495f","unresolved":false,"context_lines":[{"line_number":883,"context_line":"        \"\"\""},{"line_number":884,"context_line":"        raise NotImplementedError()"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":"    def get_traits(self, nodename):"},{"line_number":887,"context_line":"        \"\"\"Get the traits for a given node."},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"        Any custom traits returned are not required to exist in the placement"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_55d1a82e","side":"PARENT","line":886,"range":{"start_line":886,"start_character":8,"end_line":886,"end_character":18},"in_reply_to":"5f7c97a3_2a84c7d2","updated":"2018-06-19 21:51:17.000000000","message":"I was probably sending [1] right as you were writing this.  And for that same reason (OOT drivers potentially needing to cut over) I\u0027d like to leave the doc at least for a little while.\n\n[1] http://lists.openstack.org/pipermail/openstack-dev/2018-June/131635.html","commit_id":"afcf078715554e3efe5b71d583586dc112159299"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b830bac5827344a410b4ec5d399324131c59a447","unresolved":false,"context_lines":[{"line_number":800,"context_line":"        :returns: an iterable of string trait names for the supplied node."},{"line_number":801,"context_line":"        \"\"\""},{"line_number":802,"context_line":"        node \u003d self._node_from_cache(nodename)"},{"line_number":803,"context_line":"        return list(node.traits)"},{"line_number":804,"context_line":""},{"line_number":805,"context_line":"    def get_available_resource(self, nodename):"},{"line_number":806,"context_line":"        \"\"\"Retrieve resource information."}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_eafc8f40","side":"PARENT","line":803,"range":{"start_line":803,"start_character":15,"end_line":803,"end_character":19},"updated":"2018-06-19 21:20:42.000000000","message":"Any reason to not cast to a list?","commit_id":"afcf078715554e3efe5b71d583586dc112159299"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7cd66ce948779a58d3f949760487ddd6e801495f","unresolved":false,"context_lines":[{"line_number":800,"context_line":"        :returns: an iterable of string trait names for the supplied node."},{"line_number":801,"context_line":"        \"\"\""},{"line_number":802,"context_line":"        node \u003d self._node_from_cache(nodename)"},{"line_number":803,"context_line":"        return list(node.traits)"},{"line_number":804,"context_line":""},{"line_number":805,"context_line":"    def get_available_resource(self, nodename):"},{"line_number":806,"context_line":"        \"\"\"Retrieve resource information."}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_d5cdb886","side":"PARENT","line":803,"range":{"start_line":803,"start_character":15,"end_line":803,"end_character":19},"in_reply_to":"5f7c97a3_eafc8f40","updated":"2018-06-19 21:51:17.000000000","message":"Cast what to a list?  node.traits?  Before we * it and send it to provider_tree.add_traits?\n\nThe method no longer returns anything, and the effect in ProviderTree.add_traits is the same whether it\u0027s a set or a list.","commit_id":"afcf078715554e3efe5b71d583586dc112159299"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c95c1a4fa3ae35c023f76f2782eb619b41bd010e","unresolved":false,"context_lines":[{"line_number":752,"context_line":"        \"\"\""},{"line_number":753,"context_line":"        # nodename is the ironic node\u0027s UUID."},{"line_number":754,"context_line":"        node \u003d self._node_from_cache(nodename)"},{"line_number":755,"context_line":"        # TODO(jaypipes): Completely remove the reporting of VCPU, MEMORY_MB,"},{"line_number":756,"context_line":"        # and DISK_GB resource classes in early Queens when Ironic nodes will"},{"line_number":757,"context_line":"        # *always* return the custom resource class that represents the"},{"line_number":758,"context_line":"        # baremetal node class in an atomic, singular unit."},{"line_number":759,"context_line":"        if (not self._node_resources_used(node) and"},{"line_number":760,"context_line":"            self._node_resources_unavailable(node)):"},{"line_number":761,"context_line":"            # TODO(dtantsur): report resources as reserved instead of reporting"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_bb790bc6","line":758,"range":{"start_line":755,"start_character":8,"end_line":758,"end_character":59},"updated":"2018-06-20 00:55:56.000000000","message":"It would be quite nice to actually do this removal. Unfortunately, @TheJulia tells me that triple-o doesn\u0027t want to use resource classes for undercloud nodes and therefore we need to keep this around :( boo.","commit_id":"72efb4590762c375fc13d3b7446d70acc3f82173"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"16062dfbb29d8c5e6ad75147442975cc6139b1fe","unresolved":false,"context_lines":[{"line_number":752,"context_line":"        \"\"\""},{"line_number":753,"context_line":"        # nodename is the ironic node\u0027s UUID."},{"line_number":754,"context_line":"        node \u003d self._node_from_cache(nodename)"},{"line_number":755,"context_line":"        # TODO(jaypipes): Completely remove the reporting of VCPU, MEMORY_MB,"},{"line_number":756,"context_line":"        # and DISK_GB resource classes in early Queens when Ironic nodes will"},{"line_number":757,"context_line":"        # *always* return the custom resource class that represents the"},{"line_number":758,"context_line":"        # baremetal node class in an atomic, singular unit."},{"line_number":759,"context_line":"        if (not self._node_resources_used(node) and"},{"line_number":760,"context_line":"            self._node_resources_unavailable(node)):"},{"line_number":761,"context_line":"            # TODO(dtantsur): report resources as reserved instead of reporting"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_0c90f041","line":758,"range":{"start_line":755,"start_character":8,"end_line":758,"end_character":59},"in_reply_to":"5f7c97a3_6315fc3c","updated":"2018-06-20 18:05:51.000000000","message":"The information is coming from a hangout (or two) that I had with Julia K about two months ago. Sounds like there was a miscommunication somewhere. Not a big deal. I\u0027m happy to learn triple-o is using placement.","commit_id":"72efb4590762c375fc13d3b7446d70acc3f82173"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94c74f7e1d3f6254dc61d2e060f2b047a4175678","unresolved":false,"context_lines":[{"line_number":752,"context_line":"        \"\"\""},{"line_number":753,"context_line":"        # nodename is the ironic node\u0027s UUID."},{"line_number":754,"context_line":"        node \u003d self._node_from_cache(nodename)"},{"line_number":755,"context_line":"        # TODO(jaypipes): Completely remove the reporting of VCPU, MEMORY_MB,"},{"line_number":756,"context_line":"        # and DISK_GB resource classes in early Queens when Ironic nodes will"},{"line_number":757,"context_line":"        # *always* return the custom resource class that represents the"},{"line_number":758,"context_line":"        # baremetal node class in an atomic, singular unit."},{"line_number":759,"context_line":"        if (not self._node_resources_used(node) and"},{"line_number":760,"context_line":"            self._node_resources_unavailable(node)):"},{"line_number":761,"context_line":"            # TODO(dtantsur): report resources as reserved instead of reporting"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_d9816aa2","line":758,"range":{"start_line":755,"start_character":8,"end_line":758,"end_character":59},"in_reply_to":"5f7c97a3_bb790bc6","updated":"2018-06-20 07:30:11.000000000","message":"Ehnnm, this is not true, tripleo is already using resource classes for undercloud nodes (I implemented it), and jroll has a patch to remove all this.","commit_id":"72efb4590762c375fc13d3b7446d70acc3f82173"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a5ed0a56f30e0956b49b4b28280a78a2406d9c2c","unresolved":false,"context_lines":[{"line_number":752,"context_line":"        \"\"\""},{"line_number":753,"context_line":"        # nodename is the ironic node\u0027s UUID."},{"line_number":754,"context_line":"        node \u003d self._node_from_cache(nodename)"},{"line_number":755,"context_line":"        # TODO(jaypipes): Completely remove the reporting of VCPU, MEMORY_MB,"},{"line_number":756,"context_line":"        # and DISK_GB resource classes in early Queens when Ironic nodes will"},{"line_number":757,"context_line":"        # *always* return the custom resource class that represents the"},{"line_number":758,"context_line":"        # baremetal node class in an atomic, singular unit."},{"line_number":759,"context_line":"        if (not self._node_resources_used(node) and"},{"line_number":760,"context_line":"            self._node_resources_unavailable(node)):"},{"line_number":761,"context_line":"            # TODO(dtantsur): report resources as reserved instead of reporting"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_6315fc3c","line":758,"range":{"start_line":755,"start_character":8,"end_line":758,"end_character":59},"in_reply_to":"5f7c97a3_d8963f3f","updated":"2018-06-20 12:16:05.000000000","message":"I don\u0027t know where this information is coming from. TripleO does install Placement (it\u0027s a different topic that we want it to stop using Nova at all) and it uses resource classes (well, only one resource class + capabilities) for nearly a year, see https://bugs.launchpad.net/tripleo/+bug/1708653.","commit_id":"72efb4590762c375fc13d3b7446d70acc3f82173"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4725f2535ae00d7db801e762348fcd1cb560bb81","unresolved":false,"context_lines":[{"line_number":752,"context_line":"        \"\"\""},{"line_number":753,"context_line":"        # nodename is the ironic node\u0027s UUID."},{"line_number":754,"context_line":"        node \u003d self._node_from_cache(nodename)"},{"line_number":755,"context_line":"        # TODO(jaypipes): Completely remove the reporting of VCPU, MEMORY_MB,"},{"line_number":756,"context_line":"        # and DISK_GB resource classes in early Queens when Ironic nodes will"},{"line_number":757,"context_line":"        # *always* return the custom resource class that represents the"},{"line_number":758,"context_line":"        # baremetal node class in an atomic, singular unit."},{"line_number":759,"context_line":"        if (not self._node_resources_used(node) and"},{"line_number":760,"context_line":"            self._node_resources_unavailable(node)):"},{"line_number":761,"context_line":"            # TODO(dtantsur): report resources as reserved instead of reporting"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_d8963f3f","line":758,"range":{"start_line":755,"start_character":8,"end_line":758,"end_character":59},"in_reply_to":"5f7c97a3_d9816aa2","updated":"2018-06-20 11:45:54.000000000","message":"@dtantsur: that is good news! when did that change? as of a couple months ago, when I chatted with @TheJulia, she let me know triple-o did not want to use ironic resource classes because they didn\u0027t want to depend on placement.","commit_id":"72efb4590762c375fc13d3b7446d70acc3f82173"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"51083f05f995671ad7b1496f1118bbc44218e124","unresolved":false,"context_lines":[{"line_number":803,"context_line":"        provider_tree.update_inventory(nodename, result)"},{"line_number":804,"context_line":"        # TODO(efried): *Unset* traits that are \"owned\" by ironic virt but not"},{"line_number":805,"context_line":"        # set on the node object."},{"line_number":806,"context_line":"        provider_tree.add_traits(nodename, *node.traits)"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    def get_available_resource(self, nodename):"},{"line_number":809,"context_line":"        \"\"\"Retrieve resource information."}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_cfc43844","line":806,"updated":"2018-06-20 08:48:15.000000000","message":"This behaviour looks to be a little different from the current behaviour (which calls provider_tree.update_traits) - traits will be added to but not removed from the tree.\n\nI\u0027m not 100% sure what your TODO here refers to, but it sounds like a different issue.","commit_id":"72efb4590762c375fc13d3b7446d70acc3f82173"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"33c67c3221ce676d6895dd76d1981b040babd954","unresolved":false,"context_lines":[{"line_number":803,"context_line":"        provider_tree.update_inventory(nodename, result)"},{"line_number":804,"context_line":"        # TODO(efried): *Unset* traits that are \"owned\" by ironic virt but not"},{"line_number":805,"context_line":"        # set on the node object."},{"line_number":806,"context_line":"        provider_tree.add_traits(nodename, *node.traits)"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    def get_available_resource(self, nodename):"},{"line_number":809,"context_line":"        \"\"\"Retrieve resource information."}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_841ffe07","line":806,"in_reply_to":"5f7c97a3_cfc43844","updated":"2018-06-20 14:20:24.000000000","message":"You\u0027re right, Mark.  If node.traits changes we\u0027ll end up accumulating traits that should have been unset.  That\u0027s at least part of what the TODO is about: the driver needs to know the full complement of traits it \"owns\" so it can make sure to unset any of those that are currently set in the provider_tree as well as setting the ones from node.traits.  We can\u0027t just replace with node.traits because then we could be blowing away traits outside of our purview (e.g. set by the admin via the CLI).  Also note [1] which is going to set traits based on capabilities.  (Fortunately in that case it\u0027s happening after update_provider_tree, so whatever we do here won\u0027t affect it.)\n\nI\u0027m actually not sure which is the lesser evil right now (accumulating traits that shoul be unset; or blowing away traits set outside of compute).  Let\u0027s discuss.\n\n[1] https://review.openstack.org/#/c/538498/","commit_id":"72efb4590762c375fc13d3b7446d70acc3f82173"}]}
