)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"8b05f8970e2c447e4607c59773a4170c354c55e7","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Move iterator creation into loop"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When retrieving compute node stats, only the first node\u0027s stats were being"},{"line_number":10,"context_line":"retrieved. This was caused by an interator being created outside of the nested"},{"line_number":11,"context_line":"loops."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"To handle this, we need to construct a fresh iterator each time before the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAASn%2F%2B%2Ft4%3D","line":10,"updated":"2013-09-13 21:26:06.000000000","message":"Change \"interator\" -\u003e \"iterator\"","commit_id":"33c93cefa043b8b3d6db6d6f9055ad508374fd42"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"8b05f8970e2c447e4607c59773a4170c354c55e7","unresolved":false,"context_lines":[{"line_number":575,"context_line":"    #                iter() for ComputeNode) - we handle each record only once."},{"line_number":576,"context_line":"    compute_nodes.sort(key\u003dlambda node: node[\u0027id\u0027])"},{"line_number":577,"context_line":"    for nid, nsts in itertools.groupby(stats, lambda s: s[\u0027compute_node_id\u0027]):"},{"line_number":578,"context_line":"        # NOTE(jwcroppe): Reset the iterator (bug 1224712)"},{"line_number":579,"context_line":"        compute_nodes_iter \u003d iter(compute_nodes)"},{"line_number":580,"context_line":"        for node in compute_nodes_iter:"},{"line_number":581,"context_line":"            if node[\u0027id\u0027] \u003d\u003d nid:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAASn%2F%2B%2Ftw%3D","line":578,"updated":"2013-09-13 21:26:06.000000000","message":"Remove \"(bug 1224712)\", as this info can be retrieved from git later.","commit_id":"33c93cefa043b8b3d6db6d6f9055ad508374fd42"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"220fe23c694961e1a601f5b96a28018b6c2eba72","unresolved":false,"context_lines":[{"line_number":663,"context_line":"    stats \u003d values.pop(\u0027stats\u0027, {})"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    session \u003d session or get_session()"},{"line_number":666,"context_line":"    with session.begin(subtransactions\u003dTrue):"},{"line_number":667,"context_line":"        _update_stats(context, stats, compute_id, session, prune_stats)"},{"line_number":668,"context_line":"        compute_ref \u003d _compute_node_get(context, compute_id, session\u003dsession)"},{"line_number":669,"context_line":"        # Always update this, even if there\u0027s going to be no other"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2F%2FnI%3D","line":666,"updated":"2013-09-15 06:54:44.000000000","message":"this can be done away with - please see the comment below. In the case of a delete this will be called twice","commit_id":"6d6e6626897bbe70859108bb2a8c546d69d04055"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"703a859be13b33d425e8528407e5d12118c62069","unresolved":false,"context_lines":[{"line_number":663,"context_line":"    stats \u003d values.pop(\u0027stats\u0027, {})"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    session \u003d session or get_session()"},{"line_number":666,"context_line":"    with session.begin(subtransactions\u003dTrue):"},{"line_number":667,"context_line":"        _update_stats(context, stats, compute_id, session, prune_stats)"},{"line_number":668,"context_line":"        compute_ref \u003d _compute_node_get(context, compute_id, session\u003dsession)"},{"line_number":669,"context_line":"        # Always update this, even if there\u0027s going to be no other"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2F%2FSs%3D","line":666,"in_reply_to":"AAAAS3%2F%2F%2FnI%3D","updated":"2013-09-15 16:46:20.000000000","message":"Done","commit_id":"6d6e6626897bbe70859108bb2a8c546d69d04055"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"220fe23c694961e1a601f5b96a28018b6c2eba72","unresolved":false,"context_lines":[{"line_number":676,"context_line":""},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"@require_admin_context"},{"line_number":679,"context_line":"def compute_node_update(context, compute_id, values, prune_stats\u003dFalse):"},{"line_number":680,"context_line":"    return _compute_node_update(context, compute_id, values,"},{"line_number":681,"context_line":"                                prune_stats\u003dprune_stats)"},{"line_number":682,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2F%2FnM%3D","line":679,"updated":"2013-09-15 06:54:44.000000000","message":"Why not create the session here and pass it as a parameter to _compute_node_update.","commit_id":"6d6e6626897bbe70859108bb2a8c546d69d04055"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"703a859be13b33d425e8528407e5d12118c62069","unresolved":false,"context_lines":[{"line_number":676,"context_line":""},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"@require_admin_context"},{"line_number":679,"context_line":"def compute_node_update(context, compute_id, values, prune_stats\u003dFalse):"},{"line_number":680,"context_line":"    return _compute_node_update(context, compute_id, values,"},{"line_number":681,"context_line":"                                prune_stats\u003dprune_stats)"},{"line_number":682,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2F%2FSo%3D","line":679,"in_reply_to":"AAAAS3%2F%2F%2FnM%3D","updated":"2013-09-15 16:46:20.000000000","message":"Done","commit_id":"6d6e6626897bbe70859108bb2a8c546d69d04055"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"7913a57323240655bc62fd0724633989ea5d3852","unresolved":false,"context_lines":[{"line_number":686,"context_line":"    session \u003d get_session()"},{"line_number":687,"context_line":"    with session.begin():"},{"line_number":688,"context_line":"        # Prune the compute node\u0027s stats"},{"line_number":689,"context_line":"        _compute_node_update(context, compute_id, {}, True, session)"},{"line_number":690,"context_line":"        result \u003d model_query(context, models.ComputeNode, session\u003dsession).\\"},{"line_number":691,"context_line":"                 filter_by(id\u003dcompute_id).\\"},{"line_number":692,"context_line":"                 soft_delete(synchronize_session\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAS3%2F%2F9LI%3D","line":689,"updated":"2013-09-16 16:18:02.000000000","message":"Did you do this to run line 662 forcing stats to go to {} by using prune_stats? Why not call that method from here?\n\nSo, this will force \u0027updated_at\u0027 to be a time stamp near the time that the delete occurs while also forcing a prune_stats to happen. Moving updated_at might make it harder to determine from forensics what was a real stat update and what was part of a call to delete.","commit_id":"9cda1e1cbc0dd5be7e18b5364fd13c25799767b9"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"dcac268552370f73dc6ea18d51950cd74fa6921e","unresolved":false,"context_lines":[{"line_number":686,"context_line":"    session \u003d get_session()"},{"line_number":687,"context_line":"    with session.begin():"},{"line_number":688,"context_line":"        # Prune the compute node\u0027s stats"},{"line_number":689,"context_line":"        _compute_node_update(context, compute_id, {}, True, session)"},{"line_number":690,"context_line":"        result \u003d model_query(context, models.ComputeNode, session\u003dsession).\\"},{"line_number":691,"context_line":"                 filter_by(id\u003dcompute_id).\\"},{"line_number":692,"context_line":"                 soft_delete(synchronize_session\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAS3%2F%2F5LQ%3D","line":689,"in_reply_to":"AAAAS3%2F%2F5M4%3D","updated":"2013-09-17 15:37:38.000000000","message":"Done","commit_id":"9cda1e1cbc0dd5be7e18b5364fd13c25799767b9"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"52e7b94f4ee2f2820f8b2f69b74b645d68edefa6","unresolved":false,"context_lines":[{"line_number":686,"context_line":"    session \u003d get_session()"},{"line_number":687,"context_line":"    with session.begin():"},{"line_number":688,"context_line":"        # Prune the compute node\u0027s stats"},{"line_number":689,"context_line":"        _compute_node_update(context, compute_id, {}, True, session)"},{"line_number":690,"context_line":"        result \u003d model_query(context, models.ComputeNode, session\u003dsession).\\"},{"line_number":691,"context_line":"                 filter_by(id\u003dcompute_id).\\"},{"line_number":692,"context_line":"                 soft_delete(synchronize_session\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAS3%2F%2F5M4%3D","line":689,"in_reply_to":"AAAAS3%2F%2F9Gw%3D","updated":"2013-09-17 15:28:38.000000000","message":"This seems like an indirect way of deleting the stats.  It seems cleaner to me to either add a method to delete the stats directly or call _update_stats.","commit_id":"9cda1e1cbc0dd5be7e18b5364fd13c25799767b9"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"e1726673ee068ded7256f2b03983cddded693e3c","unresolved":false,"context_lines":[{"line_number":686,"context_line":"    session \u003d get_session()"},{"line_number":687,"context_line":"    with session.begin():"},{"line_number":688,"context_line":"        # Prune the compute node\u0027s stats"},{"line_number":689,"context_line":"        _compute_node_update(context, compute_id, {}, True, session)"},{"line_number":690,"context_line":"        result \u003d model_query(context, models.ComputeNode, session\u003dsession).\\"},{"line_number":691,"context_line":"                 filter_by(id\u003dcompute_id).\\"},{"line_number":692,"context_line":"                 soft_delete(synchronize_session\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAS3%2F%2F9Gw%3D","line":689,"in_reply_to":"AAAAS3%2F%2F9LI%3D","updated":"2013-09-16 16:23:18.000000000","message":"Yes, that is the purpose of this call (i.e., to prune the stats).  This is one of those \"on the fence\" items; I intentionally used this call so that we would get that trail since we are indeed \"touching\" the stats at delete time.  But you also make a good point.  I would personally vote for the way it is now, but if everyone else wants _update_stats called directly, it\u0027s certainly an easy change.  :-)","commit_id":"9cda1e1cbc0dd5be7e18b5364fd13c25799767b9"}],"nova/tests/db/test_db_api.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"c2b597a2b34214a21d4828676ac838f88c523051","unresolved":false,"context_lines":[{"line_number":5258,"context_line":"            new_stats \u003d self._stats_as_dict(node[\u0027stats\u0027])"},{"line_number":5259,"context_line":"            self._stats_equal(self.stats, new_stats)"},{"line_number":5260,"context_line":""},{"line_number":5261,"context_line":"    def test_compute_node_get_all_deleted_compute_node(self):"},{"line_number":5262,"context_line":"        # Create a service and compute node and ensure we can find its stats;"},{"line_number":5263,"context_line":"        # delete the service and compute node when done and loop again"},{"line_number":5264,"context_line":"        for x in range(2, 5):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2F4Jw%3D","line":5261,"updated":"2013-09-17 20:08:25.000000000","message":"I find this test case a bit confusing. :)  \n\nWhat\u0027s the purpose of the range(2,5)?  It should be sufficient to test the API once?","commit_id":"aacf2c5078a3e078e7045ef342e6a9f4ace48865"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"1293b1d1021a357808f2bcbb905eb83712f04d93","unresolved":false,"context_lines":[{"line_number":5258,"context_line":"            new_stats \u003d self._stats_as_dict(node[\u0027stats\u0027])"},{"line_number":5259,"context_line":"            self._stats_equal(self.stats, new_stats)"},{"line_number":5260,"context_line":""},{"line_number":5261,"context_line":"    def test_compute_node_get_all_deleted_compute_node(self):"},{"line_number":5262,"context_line":"        # Create a service and compute node and ensure we can find its stats;"},{"line_number":5263,"context_line":"        # delete the service and compute node when done and loop again"},{"line_number":5264,"context_line":"        for x in range(2, 5):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2F388%3D","line":5261,"in_reply_to":"AAAAS3%2F%2F4Jw%3D","updated":"2013-09-17 20:52:23.000000000","message":"No, it\u0027s only on multiple creates and deletes that this problem exposes the issue with compute_node_get_all.","commit_id":"aacf2c5078a3e078e7045ef342e6a9f4ace48865"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"c2b597a2b34214a21d4828676ac838f88c523051","unresolved":false,"context_lines":[{"line_number":5274,"context_line":"            compute_node_data[\u0027hypervisor_hostname\u0027] \u003d \u0027hypervisor-%s\u0027 % x"},{"line_number":5275,"context_line":"            node \u003d db.compute_node_create(self.ctxt, compute_node_data)"},{"line_number":5276,"context_line":""},{"line_number":5277,"context_line":"            # Ensure the \"new\" compute node is found"},{"line_number":5278,"context_line":"            nodes \u003d db.compute_node_get_all(self.ctxt, False)"},{"line_number":5279,"context_line":"            self.assertEqual(2, len(nodes))"},{"line_number":5280,"context_line":"            found \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2F4JQ%3D","line":5277,"updated":"2013-09-17 20:08:25.000000000","message":"Not sure you need to test again that the compute_node_create works since it\u0027s already done in other cases, but no big deal.","commit_id":"aacf2c5078a3e078e7045ef342e6a9f4ace48865"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"1293b1d1021a357808f2bcbb905eb83712f04d93","unresolved":false,"context_lines":[{"line_number":5274,"context_line":"            compute_node_data[\u0027hypervisor_hostname\u0027] \u003d \u0027hypervisor-%s\u0027 % x"},{"line_number":5275,"context_line":"            node \u003d db.compute_node_create(self.ctxt, compute_node_data)"},{"line_number":5276,"context_line":""},{"line_number":5277,"context_line":"            # Ensure the \"new\" compute node is found"},{"line_number":5278,"context_line":"            nodes \u003d db.compute_node_get_all(self.ctxt, False)"},{"line_number":5279,"context_line":"            self.assertEqual(2, len(nodes))"},{"line_number":5280,"context_line":"            found \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2F384%3D","line":5277,"in_reply_to":"AAAAS3%2F%2F4JQ%3D","updated":"2013-09-17 20:52:23.000000000","message":"Just being thorough.  :-)","commit_id":"aacf2c5078a3e078e7045ef342e6a9f4ace48865"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"c2b597a2b34214a21d4828676ac838f88c523051","unresolved":false,"context_lines":[{"line_number":5291,"context_line":"            db.compute_node_delete(self.ctxt, node[\u0027id\u0027])"},{"line_number":5292,"context_line":""},{"line_number":5293,"context_line":"            # Clean up the service"},{"line_number":5294,"context_line":"            db.service_destroy(self.ctxt, service[\u0027id\u0027])"},{"line_number":5295,"context_line":""},{"line_number":5296,"context_line":"    def test_compute_node_get_all_mult_compute_nodes_one_service_entry(self):"},{"line_number":5297,"context_line":"        service_data \u003d self.service_dict.copy()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2F4JE%3D","line":5294,"updated":"2013-09-17 20:08:25.000000000","message":"I would think a check here to confirm the stats are also soft deleted would be in order?","commit_id":"aacf2c5078a3e078e7045ef342e6a9f4ace48865"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"4f21180c1212e3305324496a0b64bbcadcc1c8b9","unresolved":false,"context_lines":[{"line_number":5291,"context_line":"            db.compute_node_delete(self.ctxt, node[\u0027id\u0027])"},{"line_number":5292,"context_line":""},{"line_number":5293,"context_line":"            # Clean up the service"},{"line_number":5294,"context_line":"            db.service_destroy(self.ctxt, service[\u0027id\u0027])"},{"line_number":5295,"context_line":""},{"line_number":5296,"context_line":"    def test_compute_node_get_all_mult_compute_nodes_one_service_entry(self):"},{"line_number":5297,"context_line":"        service_data \u003d self.service_dict.copy()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2F3vQ%3D","line":5294,"in_reply_to":"AAAAS3%2F%2F39w%3D","updated":"2013-09-17 22:00:26.000000000","message":"Just to follow up and clarify...compute_node_get won\u0027t find the deleted compute node after the fact, so there is no way to even get at its \u0027stats\u0027 to even check whether the initial stats are NOT present.  So unless we want to start changing the API contracts and behavior solely for this test case, I think this suffices.\n\nI actually agree with the desire, I just felt this was sufficiently covering the scenario and thus didn\u0027t think it warranted changing the API contracts to further test.  :-)\n\nThanks,\nJoe","commit_id":"aacf2c5078a3e078e7045ef342e6a9f4ace48865"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"cffeaa9114ebea6657d5e64cb2c4608663034e13","unresolved":false,"context_lines":[{"line_number":5291,"context_line":"            db.compute_node_delete(self.ctxt, node[\u0027id\u0027])"},{"line_number":5292,"context_line":""},{"line_number":5293,"context_line":"            # Clean up the service"},{"line_number":5294,"context_line":"            db.service_destroy(self.ctxt, service[\u0027id\u0027])"},{"line_number":5295,"context_line":""},{"line_number":5296,"context_line":"    def test_compute_node_get_all_mult_compute_nodes_one_service_entry(self):"},{"line_number":5297,"context_line":"        service_data \u003d self.service_dict.copy()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2F3Ms%3D","line":5294,"in_reply_to":"AAAAS3%2F%2F3NY%3D","updated":"2013-09-18 03:27:21.000000000","message":"Correcting a typo above, I intended to say \"...but it does NOT find *deleted* nodes...\"  :-)","commit_id":"aacf2c5078a3e078e7045ef342e6a9f4ace48865"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"61e57caa9e82d19527288ed3830693fa836ae936","unresolved":false,"context_lines":[{"line_number":5291,"context_line":"            db.compute_node_delete(self.ctxt, node[\u0027id\u0027])"},{"line_number":5292,"context_line":""},{"line_number":5293,"context_line":"            # Clean up the service"},{"line_number":5294,"context_line":"            db.service_destroy(self.ctxt, service[\u0027id\u0027])"},{"line_number":5295,"context_line":""},{"line_number":5296,"context_line":"    def test_compute_node_get_all_mult_compute_nodes_one_service_entry(self):"},{"line_number":5297,"context_line":"        service_data \u003d self.service_dict.copy()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2F3NY%3D","line":5294,"in_reply_to":"AAAAS3%2F%2F3Qk%3D","updated":"2013-09-18 03:22:07.000000000","message":"With the current APIs, there is no way to query the node\u0027s stats.  The only related API is compute_node_get, which accepts the compute node\u0027s ID, but it does find *deleted* nodes (raises an exception in that case), so by the time we can query the compute node for its stats (or lack thereof :-), that call will fail.\n\nOne potential solution would be to accept a \"read deleted?\" optional parameter, but as I commented earlier, I didn\u0027t want to change public APIs solely for the purposes of a test case, particularly because this new test case implicitly already verifies the stats are deleted by virtue of compute_node_get_all\u0027s behavior.","commit_id":"aacf2c5078a3e078e7045ef342e6a9f4ace48865"},{"author":{"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},"change_message_id":"496e95feb9f408e14052d9d39c4a38259b786e3a","unresolved":false,"context_lines":[{"line_number":5291,"context_line":"            db.compute_node_delete(self.ctxt, node[\u0027id\u0027])"},{"line_number":5292,"context_line":""},{"line_number":5293,"context_line":"            # Clean up the service"},{"line_number":5294,"context_line":"            db.service_destroy(self.ctxt, service[\u0027id\u0027])"},{"line_number":5295,"context_line":""},{"line_number":5296,"context_line":"    def test_compute_node_get_all_mult_compute_nodes_one_service_entry(self):"},{"line_number":5297,"context_line":"        service_data \u003d self.service_dict.copy()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2F3Qk%3D","line":5294,"in_reply_to":"AAAAS3%2F%2F3vQ%3D","updated":"2013-09-18 02:15:08.000000000","message":"I don\u0027t know much about the stats stuff but couldn\u0027t it be queried directly given you know the ID?","commit_id":"aacf2c5078a3e078e7045ef342e6a9f4ace48865"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"3bce05cefa9f2261650d04f9c83321c5d7dc6fe5","unresolved":false,"context_lines":[{"line_number":5291,"context_line":"            db.compute_node_delete(self.ctxt, node[\u0027id\u0027])"},{"line_number":5292,"context_line":""},{"line_number":5293,"context_line":"            # Clean up the service"},{"line_number":5294,"context_line":"            db.service_destroy(self.ctxt, service[\u0027id\u0027])"},{"line_number":5295,"context_line":""},{"line_number":5296,"context_line":"    def test_compute_node_get_all_mult_compute_nodes_one_service_entry(self):"},{"line_number":5297,"context_line":"        service_data \u003d self.service_dict.copy()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2F39w%3D","line":5294,"in_reply_to":"AAAAS3%2F%2F4JE%3D","updated":"2013-09-17 20:50:46.000000000","message":"There is no API that provides this (that I know of), so we\u0027d have to create one specifically for test case.\n\nBy virtue of this test passing, that\u0027s implicitly covered.  Since with stats not soft deleted, the compute_node_get_all call fails by definition.","commit_id":"aacf2c5078a3e078e7045ef342e6a9f4ace48865"}]}
