)]}'
{"nova/cells/manager.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d9044d11943c64a85620ba9bca09d10526a5f5c7","unresolved":false,"context_lines":[{"line_number":386,"context_line":"            nodes \u003d response.value_or_raise()"},{"line_number":387,"context_line":"            for node in nodes:"},{"line_number":388,"context_line":"                node \u003d cells_utils.add_cell_to_compute_node(node,"},{"line_number":389,"context_line":"                                                            response.cell_name)"},{"line_number":390,"context_line":"                ret_nodes.append(node)"},{"line_number":391,"context_line":"        return ret_nodes"},{"line_number":392,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa963961_6703ab74","line":389,"updated":"2015-03-27 20:14:17.000000000","message":"Hm, somehow the node being passed to add_cell_to_compute_node is a dict as seen in the cells job run on this patch:\n\nhttp://logs.openstack.org/85/157185/9/check/check-tempest-dsvm-cells/5b460b3/logs/screen-n-api.txt.gz?level\u003dTRACE#_2015-03-27_11_43_33_045","commit_id":"6cb1821644655ee5cd6f79ef1f70e018df39e8c5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"87948869ff20ba96999cf435e2293f27da8779a1","unresolved":false,"context_lines":[{"line_number":386,"context_line":"            nodes \u003d response.value_or_raise()"},{"line_number":387,"context_line":"            for node in nodes:"},{"line_number":388,"context_line":"                node \u003d cells_utils.add_cell_to_compute_node(node,"},{"line_number":389,"context_line":"                                                            response.cell_name)"},{"line_number":390,"context_line":"                ret_nodes.append(node)"},{"line_number":391,"context_line":"        return ret_nodes"},{"line_number":392,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da9b358b_8807d71b","line":389,"in_reply_to":"da9b358b_0cf77bd4","updated":"2015-03-31 04:58:07.000000000","message":"Sylvain, I dug into this and found the ComputeNode object got turned into a dict because cells messaging Response can\u0027t handle objects. I put up a patch for it here: https://review.openstack.org/#/c/169165/\n\nAfter this patch it preserves ComputeNode object from cells/messaging.py but, things fail later down the line (I *think*) because ComputeNodeProxy is going over rpc and nothing knows how to serialize and deserialize that. I find in nova/compute/cells_api.py, the result of self.cells_rpcapi.compute_node_get_all(context) is a list of dicts instead of a list of ComputeNodeProxy. I\u0027m not yet sure how to solve it.","commit_id":"6cb1821644655ee5cd6f79ef1f70e018df39e8c5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"954b4f709a42e1fb0d150c7c2f6b039e6ac4ca4e","unresolved":false,"context_lines":[{"line_number":386,"context_line":"            nodes \u003d response.value_or_raise()"},{"line_number":387,"context_line":"            for node in nodes:"},{"line_number":388,"context_line":"                node \u003d cells_utils.add_cell_to_compute_node(node,"},{"line_number":389,"context_line":"                                                            response.cell_name)"},{"line_number":390,"context_line":"                ret_nodes.append(node)"},{"line_number":391,"context_line":"        return ret_nodes"},{"line_number":392,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da9b358b_0cf77bd4","line":389,"in_reply_to":"da9b358b_cc48735e","updated":"2015-03-30 12:45:37.000000000","message":"That\u0027s a Tempest test which is failing so there is no mock in there... \n\nThat said, I don\u0027t see how it will be turned into a dict :(","commit_id":"6cb1821644655ee5cd6f79ef1f70e018df39e8c5"},{"author":{"_account_id":9459,"name":".Haifeng Yan","email":"yanheven@qq.com","username":"yan"},"change_message_id":"a1511c01d5f13d781368654292b0feb82cac56f0","unresolved":false,"context_lines":[{"line_number":386,"context_line":"            nodes \u003d response.value_or_raise()"},{"line_number":387,"context_line":"            for node in nodes:"},{"line_number":388,"context_line":"                node \u003d cells_utils.add_cell_to_compute_node(node,"},{"line_number":389,"context_line":"                                                            response.cell_name)"},{"line_number":390,"context_line":"                ret_nodes.append(node)"},{"line_number":391,"context_line":"        return ret_nodes"},{"line_number":392,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da9b358b_ff261f67","line":389,"in_reply_to":"da9b358b_cc48735e","updated":"2015-03-31 01:48:10.000000000","message":"when I check unit test modules in detail, I realized what I said above was totally wrong :(  Just ignore me.","commit_id":"6cb1821644655ee5cd6f79ef1f70e018df39e8c5"},{"author":{"_account_id":9459,"name":".Haifeng Yan","email":"yanheven@qq.com","username":"yan"},"change_message_id":"5f380c20efa261416558c86763cb081af7fd3dad","unresolved":false,"context_lines":[{"line_number":386,"context_line":"            nodes \u003d response.value_or_raise()"},{"line_number":387,"context_line":"            for node in nodes:"},{"line_number":388,"context_line":"                node \u003d cells_utils.add_cell_to_compute_node(node,"},{"line_number":389,"context_line":"                                                            response.cell_name)"},{"line_number":390,"context_line":"                ret_nodes.append(node)"},{"line_number":391,"context_line":"        return ret_nodes"},{"line_number":392,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da9b358b_cc48735e","line":389,"in_reply_to":"fa963961_6703ab74","updated":"2015-03-30 12:40:16.000000000","message":"this test failed because the unit test fake data is a dict.","commit_id":"6cb1821644655ee5cd6f79ef1f70e018df39e8c5"}],"nova/cells/utils.py":[{"author":{"_account_id":6450,"name":"Hans Lindgren","email":"hanlind@kth.se","username":"hanlind"},"change_message_id":"d66e7a63b28a5fa1a477ecd1ab1befc8fe025688","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    # NOTE(sbauza): As compute_node is a ComputeNode object, we need to wrap it"},{"line_number":147,"context_line":"    # for adding the cell_path information"},{"line_number":148,"context_line":"    compute_proxy \u003d ComputeNodeProxy(compute_node, cell_name)"},{"line_number":149,"context_line":"    try:"},{"line_number":150,"context_line":"        service \u003d compute_proxy.service"},{"line_number":151,"context_line":"    except exception.ServiceNotFound:"},{"line_number":152,"context_line":"        service \u003d None"}],"source_content_type":"text/x-python","patch_set":10,"id":"da9b358b_1eac0533","line":149,"updated":"2015-03-31 18:38:00.000000000","message":"Do we even need this handling now that the compute_node/service relationship is gone?","commit_id":"12cbe70b313741b995b7d8a5eaa9eb6f04ff5622"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"a68881e8ac7de570c7992aae4adf34ce57e1f95f","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class ProxyObjectSerializer(obj_base.NovaObjectSerializer):"},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        self.serializer \u003d super(ProxyObjectSerializer, self)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _process_object(self, context, objprim):"},{"line_number":40,"context_line":"        return _CellProxy.obj_from_primitive(self.serializer, objprim, context)"}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_557df51a","line":37,"updated":"2015-04-02 18:16:54.000000000","message":"Should call supers __init__ as well.","commit_id":"67539058dec3c783353c87cacb11b23006a31d8c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8f60b1f9109c63e530373b05b0b5076969744998","unresolved":false,"context_lines":[{"line_number":35,"context_line":"class ProxyObjectSerializer(obj_base.NovaObjectSerializer):"},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        super(ProxyObjectSerializer, self).__init__()"},{"line_number":38,"context_line":"        self.serializer \u003d super(ProxyObjectSerializer, self)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _process_object(self, context, objprim):"},{"line_number":41,"context_line":"        return _CellProxy.obj_from_primitive(self.serializer, objprim, context)"}],"source_content_type":"text/x-python","patch_set":14,"id":"baa041b7_3f8c8034","line":38,"updated":"2015-04-03 04:36:51.000000000","message":"Are these super calls not redundant, L37 and L38?","commit_id":"0860766e16cc27ad11e9e238331297f4661af796"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"35de8e65e64d035d219ffd422f1f6fde1fddd26c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"class ProxyObjectSerializer(obj_base.NovaObjectSerializer):"},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        super(ProxyObjectSerializer, self).__init__()"},{"line_number":38,"context_line":"        self.serializer \u003d super(ProxyObjectSerializer, self)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _process_object(self, context, objprim):"},{"line_number":41,"context_line":"        return _CellProxy.obj_from_primitive(self.serializer, objprim, context)"}],"source_content_type":"text/x-python","patch_set":14,"id":"baa041b7_dfcb5452","line":38,"in_reply_to":"baa041b7_3f8c8034","updated":"2015-04-03 04:47:19.000000000","message":"Should have done a test before voting. My mistake.","commit_id":"0860766e16cc27ad11e9e238331297f4661af796"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"f28141bfe4e75b424a9a746856d20959833060cc","unresolved":false,"context_lines":[{"line_number":35,"context_line":"class ProxyObjectSerializer(obj_base.NovaObjectSerializer):"},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        super(ProxyObjectSerializer, self).__init__()"},{"line_number":38,"context_line":"        self.serializer \u003d super(ProxyObjectSerializer, self)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _process_object(self, context, objprim):"},{"line_number":41,"context_line":"        return _CellProxy.obj_from_primitive(self.serializer, objprim, context)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_d398346d","line":38,"in_reply_to":"baa041b7_69bdb267","updated":"2015-04-06 14:06:27.000000000","message":"Right, the init call isn\u0027t necessary at this point, but future proofs us.","commit_id":"0860766e16cc27ad11e9e238331297f4661af796"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"77cbb4037dd586574d5db845a7e6151bb0d7a831","unresolved":false,"context_lines":[{"line_number":35,"context_line":"class ProxyObjectSerializer(obj_base.NovaObjectSerializer):"},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        super(ProxyObjectSerializer, self).__init__()"},{"line_number":38,"context_line":"        self.serializer \u003d super(ProxyObjectSerializer, self)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _process_object(self, context, objprim):"},{"line_number":41,"context_line":"        return _CellProxy.obj_from_primitive(self.serializer, objprim, context)"}],"source_content_type":"text/x-python","patch_set":14,"id":"baa041b7_69bdb267","line":38,"in_reply_to":"baa041b7_dfcb5452","updated":"2015-04-03 10:05:46.000000000","message":"Actually, the parent class is not having an init method, so that\u0027s not really important now. But I agree with alaski, we should leave the common pattern in order to make sure that this child object could be calling the parent init method if then it would be added later on.","commit_id":"0860766e16cc27ad11e9e238331297f4661af796"}],"nova/compute/cells_api.py":[{"author":{"_account_id":12548,"name":"Dheeraj Gupta","email":"dheeraj.gupta4@gmail.com","username":"dgupta"},"change_message_id":"a9b72e622b30bc5d874efd3f154f372620a801a3","unresolved":false,"context_lines":[{"line_number":721,"context_line":"        return [self._get_compute_proxy(context, db_compute)"},{"line_number":722,"context_line":"                for db_compute in db_computes]"},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"    def compute_node_search_by_hypervisor(self, context, hypervisor_match):"},{"line_number":725,"context_line":"        return self.cells_rpcapi.compute_node_get_all(context,"},{"line_number":726,"context_line":"                hypervisor_match\u003dhypervisor_match)"},{"line_number":727,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_590aab20","line":724,"updated":"2015-03-20 04:20:04.000000000","message":"Need the _get_compute_proxy call in this method too.","commit_id":"b7116c08353f969318a1a4b9ec36a0c77c6fc585"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"333ec7b0308868c54b5d1d869be7df7b545e8461","unresolved":false,"context_lines":[{"line_number":721,"context_line":"        return [self._get_compute_proxy(context, db_compute)"},{"line_number":722,"context_line":"                for db_compute in db_computes]"},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"    def compute_node_search_by_hypervisor(self, context, hypervisor_match):"},{"line_number":725,"context_line":"        return self.cells_rpcapi.compute_node_get_all(context,"},{"line_number":726,"context_line":"                hypervisor_match\u003dhypervisor_match)"},{"line_number":727,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6ced46_e96edf95","line":724,"in_reply_to":"9a80dd14_590aab20","updated":"2015-03-23 09:15:11.000000000","message":"Dheeraj is right","commit_id":"b7116c08353f969318a1a4b9ec36a0c77c6fc585"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d5e6a73c17ebe0909f40e617657d3145db735894","unresolved":false,"context_lines":[{"line_number":705,"context_line":"        comp_cell_path, comp_id \u003d cells_utils.split_cell_and_item("},{"line_number":706,"context_line":"            db_compute[\u0027id\u0027])"},{"line_number":707,"context_line":"        db_compute[\u0027id\u0027] \u003d comp_id"},{"line_number":708,"context_line":"        compute_obj \u003d objects.ComputeNode._from_db_object("},{"line_number":709,"context_line":"            context, objects.ComputeNode(), db_compute)"},{"line_number":710,"context_line":"        return ComputeNodeProxy(compute_obj, comp_cell_path)"},{"line_number":711,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6ced46_3d7b487c","line":708,"updated":"2015-03-25 21:38:09.000000000","message":"I actually found a problem with this while testing this patch series with devstack.\n\nThe db_compute object here is not actually an sqlalchemy model object. It\u0027s a primitivized ComputeNode object (primitvized in cells/messaging.py so as to preserve the string id for cell routing). So this call can blow up if the attribute \"stats\" is present, because it is a dict, and _from_db_object expects it to be a string (as represented in the sqlalchemy model object).\n\nTrace: http://pastebin.com/H85aQbDR","commit_id":"ed971695034804b4699fd69df3956f2d7e141a95"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a72696d7adfac5e52de958f46b8a64a7636c59a6","unresolved":false,"context_lines":[{"line_number":705,"context_line":"        comp_cell_path, comp_id \u003d cells_utils.split_cell_and_item("},{"line_number":706,"context_line":"            db_compute[\u0027id\u0027])"},{"line_number":707,"context_line":"        db_compute[\u0027id\u0027] \u003d comp_id"},{"line_number":708,"context_line":"        compute_obj \u003d objects.ComputeNode._from_db_object("},{"line_number":709,"context_line":"            context, objects.ComputeNode(), db_compute)"},{"line_number":710,"context_line":"        return ComputeNodeProxy(compute_obj, comp_cell_path)"},{"line_number":711,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6ced46_b81e66b9","line":708,"in_reply_to":"1a6ced46_3d7b487c","updated":"2015-03-25 22:26:18.000000000","message":"as discussed per IRC, the better way is to amend the add_cell_to_compute_node factory to return a ComputeNodeProxy based on a ComputeNode object and get rid of that whole code here.","commit_id":"ed971695034804b4699fd69df3956f2d7e141a95"}],"nova/tests/unit/compute/test_host_api.py":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"333ec7b0308868c54b5d1d869be7df7b545e8461","unresolved":false,"context_lines":[{"line_number":514,"context_line":"        with mock.patch.object(self.host_api.cells_rpcapi,"},{"line_number":515,"context_line":"                \u0027compute_node_get\u0027) as compute_node_get:"},{"line_number":516,"context_line":"            compute_node_get.return_value \u003d compute_node"},{"line_number":517,"context_line":"            result \u003d self.host_api.compute_node_get(self.ctxt, 42)"},{"line_number":518,"context_line":"            compute_node_get.assert_called_once_with(self.ctxt, 42)"},{"line_number":519,"context_line":"            self.assertEqual(\u0027path!to!cell@42\u0027, result[\u0027id\u0027])"},{"line_number":520,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6ced46_a9b067f5","line":517,"updated":"2015-03-23 09:15:11.000000000","message":"Demonstate the test assert that the return of the method compute_node_get return a ComputeNodeProxy","commit_id":"b7116c08353f969318a1a4b9ec36a0c77c6fc585"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"333ec7b0308868c54b5d1d869be7df7b545e8461","unresolved":false,"context_lines":[{"line_number":526,"context_line":"        with mock.patch.object(self.host_api.cells_rpcapi,"},{"line_number":527,"context_line":"                \u0027compute_node_get_all\u0027) as compute_node_get_all:"},{"line_number":528,"context_line":"            compute_node_get_all.return_value \u003d [compute_node1, compute_node2]"},{"line_number":529,"context_line":"            result \u003d self.host_api.compute_node_get_all(self.ctxt)"},{"line_number":530,"context_line":"            compute_node_get_all.assert_called_once_with(self.ctxt)"},{"line_number":531,"context_line":"            self.assertEqual(\u0027path!to!cell@42\u0027, result[0][\u0027id\u0027])"},{"line_number":532,"context_line":"            self.assertEqual(\u0027path!to!cell@3\u0027, result[1][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6ced46_09c89b73","line":529,"updated":"2015-03-23 09:15:11.000000000","message":"Demonstate the test assert that the return of the method compute_node_get_all return a list of ComputeNodeProxy","commit_id":"b7116c08353f969318a1a4b9ec36a0c77c6fc585"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"0f7de2d1e930e4472329c5b5397ca8736813a430","unresolved":false,"context_lines":[{"line_number":520,"context_line":"            result \u003d self.host_api.compute_node_get(self.ctxt, 42)"},{"line_number":521,"context_line":"            compute_node_get.assert_called_once_with(self.ctxt, 42)"},{"line_number":522,"context_line":"            self.assertEqual(\u0027path!to!cell@42\u0027, result[\u0027id\u0027])"},{"line_number":523,"context_line":"            self.assertIsInstance(result, cells_api.ComputeNodeProxy)"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def test_compute_node_get_all(self):"},{"line_number":526,"context_line":"        compute_node1 \u003d test_compute_node.fake_compute_node.copy()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6ced46_68c4725f","line":523,"updated":"2015-03-24 11:14:11.000000000","message":";-)","commit_id":"ed971695034804b4699fd69df3956f2d7e141a95"}]}
