)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"abca89e7863a662632555cc474a3ebfaddb0653f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Danil Akhmetov \u003cdakhmetov@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-12 16:37:58 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Remove compute host from all host aggregates when compute service is deleting"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Nova currently does not check if compute host included in host-aggregates"},{"line_number":10,"context_line":"when user deletes compute service. It leads to inconsistency in nova host"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"1aa78d24_26de1a11","line":7,"updated":"2016-07-12 16:21:35.000000000","message":"nit: is deleted","commit_id":"ae40485f68c8515f086958a21362bb27162be723"}],"nova/api/openstack/compute/services.py":[{"author":{"_account_id":20223,"name":"zhaolihui","email":"zhaolh@awcloud.com","username":"zhaolihui"},"change_message_id":"c8675bd602c0ce4e33dbd9149699331ddb806bde","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            for svc in self.host_api.service_get_all(context, set_zones\u003dTrue):"},{"line_number":186,"context_line":"                service_stats \u003d self._get_service_detail(svc, ())"},{"line_number":187,"context_line":"                if int(service_stats.get(\u0027id\u0027)) \u003d\u003d int(id) and service_stats[\u0027binary\u0027] \u003d\u003d \u0027nova-compute\u0027:"},{"line_number":188,"context_line":"                    compute_hostname \u003d service_stats[\u0027host\u0027]"},{"line_number":189,"context_line":"            for aggregate in aggregates:"},{"line_number":190,"context_line":"                for host in self.aggregate_api.get_aggregate(context, aggregate.id).hosts:"},{"line_number":191,"context_line":"                   if host \u003d\u003d compute_hostname:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a18252c_9902d608","line":188,"range":{"start_line":188,"start_character":20,"end_line":188,"end_character":60},"updated":"2016-04-15 04:02:44.000000000","message":"If there is only one compute_hostname, you should add break in for sentence.\nIf there are mulitiple compute_hostname, you should define compute_name as a list variable, and modify your code.","commit_id":"b4026d57dc4072fc6f3d9bc62a6bcbdafb75027d"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"2074603dd116e91acc1b3267f16eb9a8efc39296","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexc.format_message())"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        try:"},{"line_number":183,"context_line":"            aggregates \u003d self.aggregate_api.get_aggregate_list(context)"},{"line_number":184,"context_line":"            compute_hostname \u003d \u0027\u0027"},{"line_number":185,"context_line":"            for svc in self.host_api.service_get_all(context, set_zones\u003dTrue):"},{"line_number":186,"context_line":"                service_stats \u003d self._get_service_detail(svc, ())"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_f6c7a30f","line":183,"range":{"start_line":183,"start_character":12,"end_line":183,"end_character":71},"updated":"2016-04-27 22:45:22.000000000","message":"Is there a reason why we can\u0027t just call objects.AggregateList.get_by_host() ?  That would let us skip the loop over all the aggregates.","commit_id":"16b03817b62d0e7cf133967b5d3ba77d4d415443"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"2074603dd116e91acc1b3267f16eb9a8efc39296","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                   and service_stats[\u0027binary\u0027] \u003d\u003d \u0027nova-compute\u0027:"},{"line_number":189,"context_line":"                    compute_hostname \u003d service_stats[\u0027host\u0027]"},{"line_number":190,"context_line":"                    break"},{"line_number":191,"context_line":"            for aggr in aggregates:"},{"line_number":192,"context_line":"                for host in self.aggregate_api.get_aggregate(context,"},{"line_number":193,"context_line":"                                                             aggr.id).hosts:"},{"line_number":194,"context_line":"                    if host \u003d\u003d compute_hostname:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_d6eee720","line":191,"range":{"start_line":191,"start_character":12,"end_line":191,"end_character":35},"updated":"2016-04-27 22:45:22.000000000","message":"maybe also check whether compute_hostname is not empty?  If it is, there\u0027s no point in looping over the aggregates.  Also, maybe move the call to get the aggregates down below this check so that if compute_hostname is empty we don\u0027t query the DB at all.","commit_id":"16b03817b62d0e7cf133967b5d3ba77d4d415443"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"91637e0a10275da923e457e5982cb983d7e184f9","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexc.format_message())"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        try:"},{"line_number":184,"context_line":"            for svc in self.host_api.service_get_all(context, set_zones\u003dTrue):"},{"line_number":185,"context_line":"                service_stats \u003d self._get_service_detail(svc, ())"},{"line_number":186,"context_line":"                if int(service_stats.get(\u0027id\u0027)) \u003d\u003d int(id) \\"},{"line_number":187,"context_line":"                   and service_stats[\u0027binary\u0027] \u003d\u003d \u0027nova-compute\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1aa78d24_9eaa4584","line":184,"updated":"2016-07-08 13:39:13.000000000","message":"It seems a bit wasteful to load a list of all services when you only need one and got its ID. If HostAPI does not provide such a helper, maybe we could introduce a new one, something like get_service_by_id()? (https://github.com/openstack/nova/blob/bcabd1a5b1d9ba6a40ed16673e124ab6436c1f0e/nova/compute/api.py#L3567)","commit_id":"39989604cb3e1c58aab68ab62f1affb79c45f31e"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c27d881d24c7aca3af17cdc5d65e2a9438305c9e","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        except exception.InvalidInput as exc:"},{"line_number":181,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexc.format_message())"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        try:"},{"line_number":184,"context_line":"            service \u003d objects.Service.get_by_id(context, id)"},{"line_number":185,"context_line":"            if service.binary \u003d\u003d \u0027nova-compute\u0027:"},{"line_number":186,"context_line":"                compute_hostname \u003d service.host"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_7bce2f2e","line":183,"updated":"2016-07-11 17:09:48.000000000","message":"I believe, you have two problems here right now:\n\n1) get_by_id() or any underlying DB method are not mocked, thus, tests currently fail with \u0027service not found\u0027\n\n2) get_by_id() expects an integer argument, but id is a string here\n\nThe latter is probably even more subtle, because I\u0027m pretty sure it will not trigger an error on MySQL by default, but comparison with integer values in the table will always yield false, so it will just fail silently.","commit_id":"aa086a4fc05376a671f0367882e6a5a76739bc88"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c27d881d24c7aca3af17cdc5d65e2a9438305c9e","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexc.format_message())"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        try:"},{"line_number":184,"context_line":"            service \u003d objects.Service.get_by_id(context, id)"},{"line_number":185,"context_line":"            if service.binary \u003d\u003d \u0027nova-compute\u0027:"},{"line_number":186,"context_line":"                compute_hostname \u003d service.host"},{"line_number":187,"context_line":"                aggregates \u003d objects.AggregateList.\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_db1483ea","line":184,"updated":"2016-07-11 17:09:48.000000000","message":"nit: a small #NOTE here on why we need this would probably be useful","commit_id":"aa086a4fc05376a671f0367882e6a5a76739bc88"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"abca89e7863a662632555cc474a3ebfaddb0653f","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            service \u003d self.host_api.service_get_by_id(context, id)"},{"line_number":184,"context_line":"            # remove the service from all the aggregates in which it\u0027s included"},{"line_number":185,"context_line":"            if service.binary \u003d\u003d \u0027nova-compute\u0027:"},{"line_number":186,"context_line":"                aggregates \u003d self.aggregate_api.\\"},{"line_number":187,"context_line":"                             get_aggregates_by_host(context,"},{"line_number":188,"context_line":"                                                    service.host)"},{"line_number":189,"context_line":"                for aggr in aggregates:"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aa78d24_06ef9e1e","line":186,"updated":"2016-07-12 16:21:35.000000000","message":"nit: we do not usually wrap lines like that, but as long as pep8/hacking are happy I think it\u0027s fine","commit_id":"ae40485f68c8515f086958a21362bb27162be723"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"abca89e7863a662632555cc474a3ebfaddb0653f","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                             get_aggregates_by_host(context,"},{"line_number":188,"context_line":"                                                    service.host)"},{"line_number":189,"context_line":"                for aggr in aggregates:"},{"line_number":190,"context_line":"                    self.aggregate_api.\\"},{"line_number":191,"context_line":"                    remove_host_from_aggregate(context,"},{"line_number":192,"context_line":"                                               aggr.id,"},{"line_number":193,"context_line":"                                               service.host)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aa78d24_a6de8a6a","line":190,"updated":"2016-07-12 16:21:35.000000000","message":"ditto","commit_id":"ae40485f68c8515f086958a21362bb27162be723"},{"author":{"_account_id":6450,"name":"Hans Lindgren","email":"hanlind@kth.se","username":"hanlind"},"change_message_id":"0151ec118dc7f57d8459bfc67256968639efad90","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova.api.openstack import wsgi"},{"line_number":21,"context_line":"from nova.api import validation"},{"line_number":22,"context_line":"from nova import compute"},{"line_number":23,"context_line":"from nova.compute import api as compute_api"},{"line_number":24,"context_line":"from nova import exception"},{"line_number":25,"context_line":"from nova.i18n import _"},{"line_number":26,"context_line":"from nova.policies import services as services_policies"}],"source_content_type":"text/x-python","patch_set":11,"id":"fad55976_3bf54883","line":23,"updated":"2016-07-15 19:20:53.000000000","message":"Why not use the compute we already import at L22?","commit_id":"ef45227180682e6ef5399b043d5e39ebbb92c617"},{"author":{"_account_id":21382,"name":"Danil","email":"dakhmetov@mirantis.com","username":"dinobot"},"change_message_id":"acdbacbda0ccc5882f7a41c7c797e3fbcbda6bd5","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova.api.openstack import wsgi"},{"line_number":21,"context_line":"from nova.api import validation"},{"line_number":22,"context_line":"from nova import compute"},{"line_number":23,"context_line":"from nova.compute import api as compute_api"},{"line_number":24,"context_line":"from nova import exception"},{"line_number":25,"context_line":"from nova.i18n import _"},{"line_number":26,"context_line":"from nova.policies import services as services_policies"}],"source_content_type":"text/x-python","patch_set":11,"id":"fad55976_919aec61","line":23,"in_reply_to":"fad55976_3bf54883","updated":"2016-07-16 20:19:44.000000000","message":"Done","commit_id":"ef45227180682e6ef5399b043d5e39ebbb92c617"},{"author":{"_account_id":6450,"name":"Hans Lindgren","email":"hanlind@kth.se","username":"hanlind"},"change_message_id":"0151ec118dc7f57d8459bfc67256968639efad90","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                    self.aggregate_api.remove_host_from_aggregate(context,"},{"line_number":190,"context_line":"                                                                  ag.id,"},{"line_number":191,"context_line":"                                                                  service.host)"},{"line_number":192,"context_line":"            self.host_api.service_delete(context, id)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        except exception.ServiceNotFound:"},{"line_number":195,"context_line":"            explanation \u003d _(\"Service %s not found.\") % id"}],"source_content_type":"text/x-python","patch_set":11,"id":"fad55976_0540e155","line":192,"updated":"2016-07-15 19:20:53.000000000","message":"I can\u0027t help but think this is done at the wrong level. Wouldn\u0027t it be better to add this logic inside the host_api.service_delete() method. As an added bonus, the service object is already fetched there so no need to get it twice?","commit_id":"ef45227180682e6ef5399b043d5e39ebbb92c617"},{"author":{"_account_id":21382,"name":"Danil","email":"dakhmetov@mirantis.com","username":"dinobot"},"change_message_id":"acdbacbda0ccc5882f7a41c7c797e3fbcbda6bd5","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                    self.aggregate_api.remove_host_from_aggregate(context,"},{"line_number":190,"context_line":"                                                                  ag.id,"},{"line_number":191,"context_line":"                                                                  service.host)"},{"line_number":192,"context_line":"            self.host_api.service_delete(context, id)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        except exception.ServiceNotFound:"},{"line_number":195,"context_line":"            explanation \u003d _(\"Service %s not found.\") % id"}],"source_content_type":"text/x-python","patch_set":11,"id":"fad55976_317d00e8","line":192,"in_reply_to":"fad55976_0540e155","updated":"2016-07-16 20:19:44.000000000","message":"Thanks for interesting suggestion, Hans! I think this logic is on the right place, as host_api methods are necessary mostly to perform underlying db api calls.","commit_id":"ef45227180682e6ef5399b043d5e39ebbb92c617"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"74c032a9880c172aeab453a3dca3e519248a9ade","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                    self.aggregate_api.remove_host_from_aggregate(context,"},{"line_number":190,"context_line":"                                                                  ag.id,"},{"line_number":191,"context_line":"                                                                  service.host)"},{"line_number":192,"context_line":"            self.host_api.service_delete(context, id)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        except exception.ServiceNotFound:"},{"line_number":195,"context_line":"            explanation \u003d _(\"Service %s not found.\") % id"}],"source_content_type":"text/x-python","patch_set":11,"id":"dada55a8_7daa1f1b","line":192,"in_reply_to":"fad55976_317d00e8","updated":"2016-07-17 18:28:40.000000000","message":"I agree with the current approach here. A case can definitely be made that service_delete should handle the removal of the host from an aggregate, however I prefer that it remain a lower level method. What it should do is check if the host is a member of an aggregate and fail to delete in that case.\n\nI do not like to have implicit behaviors hidden behind methods that don\u0027t indicate what will happen. service_delete should delete the service, and a method which removes from aggregates and then deletes the service should be named more appropriately. Maybe a new clean_up_service method or something like that.","commit_id":"ef45227180682e6ef5399b043d5e39ebbb92c617"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"e7d748e34902f85056f41baf503ba576f73880b2","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                                                                  ag.id,"},{"line_number":190,"context_line":"                                                                  service.host)"},{"line_number":191,"context_line":"            self.host_api.service_delete(context, id)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        except exception.ServiceNotFound:"},{"line_number":194,"context_line":"            explanation \u003d _(\"Service %s not found.\") % id"},{"line_number":195,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003dexplanation)"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_bd62d714","line":192,"updated":"2016-07-17 18:29:34.000000000","message":"Whitespace changes like this should be avoided.","commit_id":"1abac25fd2967be00c4d584c06ba15ca4e8d04cc"}],"nova/compute/api.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"60d15c316eaac3f63b2093b6c553b23016e57f3e","unresolved":false,"context_lines":[{"line_number":3725,"context_line":"        \"\"\"Get all the aggregates.\"\"\""},{"line_number":3726,"context_line":"        return objects.AggregateList.get_all(context)"},{"line_number":3727,"context_line":""},{"line_number":3728,"context_line":"    def get_aggregates_by_host(self, context, compute_host):"},{"line_number":3729,"context_line":"        \"\"\"Get all the aggregates where the given host is presented.\"\"\""},{"line_number":3730,"context_line":"        return objects.AggregateList.get_by_host(context, compute_host)"},{"line_number":3731,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fad55976_bf2acbe5","line":3728,"updated":"2016-07-15 16:14:18.000000000","message":"I\u0027m not sure why requests to call object methods are being proxied through the compute api, but this matches what is already being done.","commit_id":"ef45227180682e6ef5399b043d5e39ebbb92c617"},{"author":{"_account_id":21382,"name":"Danil","email":"dakhmetov@mirantis.com","username":"dinobot"},"change_message_id":"acdbacbda0ccc5882f7a41c7c797e3fbcbda6bd5","unresolved":false,"context_lines":[{"line_number":3725,"context_line":"        \"\"\"Get all the aggregates.\"\"\""},{"line_number":3726,"context_line":"        return objects.AggregateList.get_all(context)"},{"line_number":3727,"context_line":""},{"line_number":3728,"context_line":"    def get_aggregates_by_host(self, context, compute_host):"},{"line_number":3729,"context_line":"        \"\"\"Get all the aggregates where the given host is presented.\"\"\""},{"line_number":3730,"context_line":"        return objects.AggregateList.get_by_host(context, compute_host)"},{"line_number":3731,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fad55976_d1d2a4ff","line":3728,"in_reply_to":"fad55976_bf2acbe5","updated":"2016-07-16 20:19:44.000000000","message":"The helpers lets to access a specific objects using only compute api. This is useful, so I think it should be introduced here.","commit_id":"ef45227180682e6ef5399b043d5e39ebbb92c617"}],"nova/tests/unit/api/openstack/compute/test_services.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"abca89e7863a662632555cc474a3ebfaddb0653f","unresolved":false,"context_lines":[{"line_number":554,"context_line":"    def test_services_delete(self):"},{"line_number":555,"context_line":"        self.ext_mgr.extensions[\u0027os-extended-services-delete\u0027] \u003d True"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"        self.host_api.db.service_create(self.ctxt,"},{"line_number":558,"context_line":"            {\u0027host\u0027: \u0027fake-compute-host\u0027,"},{"line_number":559,"context_line":"             \u0027binary\u0027: \u0027nova-compute\u0027,"},{"line_number":560,"context_line":"             \u0027topic\u0027: \u0027compute\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aa78d24_86a1ce96","line":557,"updated":"2016-07-12 16:21:35.000000000","message":"nit: tests pass now, but in general it\u0027s better to use the ID values returned from DB methods","commit_id":"ae40485f68c8515f086958a21362bb27162be723"}],"nova/tests/unit/compute/test_host_api.py":[{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"329ca0795fc9bce536ecc27c368e9f3e115689aa","unresolved":false,"context_lines":[{"line_number":466,"context_line":"                self.ctxt, cell_service_id)"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"    def test_service_delete_compute_in_aggregate(self):"},{"line_number":469,"context_line":"        pass"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    @mock.patch.object(objects.InstanceList, \u0027get_by_host\u0027)"},{"line_number":472,"context_line":"    def test_instance_get_all_by_host(self, mock_get):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_3750940a","line":469,"range":{"start_line":469,"start_character":8,"end_line":469,"end_character":12},"updated":"2016-05-02 15:58:42.000000000","message":"If you can\u0027t do a useful test here, please add a comment explaining why not.  (Like in test_get_host_uptime_service_down() further down in the code.)","commit_id":"758dfc45a294f3b8598dda9eebca2efe0f669927"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"abca89e7863a662632555cc474a3ebfaddb0653f","unresolved":false,"context_lines":[{"line_number":312,"context_line":"            destroy.assert_called_once_with()"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def test_service_delete_compute_in_aggregate(self):"},{"line_number":315,"context_line":"        self.host_api.db.service_create(self.ctxt,"},{"line_number":316,"context_line":"            {\u0027host\u0027: \u0027fake-compute-host\u0027,"},{"line_number":317,"context_line":"             \u0027binary\u0027: \u0027nova-compute\u0027,"},{"line_number":318,"context_line":"             \u0027topic\u0027: \u0027compute\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aa78d24_8edc40e5","line":315,"updated":"2016-07-12 16:21:35.000000000","message":"nit: id ditto","commit_id":"ae40485f68c8515f086958a21362bb27162be723"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"abca89e7863a662632555cc474a3ebfaddb0653f","unresolved":false,"context_lines":[{"line_number":434,"context_line":"                self.ctxt, cell_service_id)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def test_service_delete_compute_in_aggregate(self):"},{"line_number":437,"context_line":"        # this test is not valid for cell"},{"line_number":438,"context_line":"        pass"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    @mock.patch.object(objects.InstanceList, \u0027get_by_host\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aa78d24_eecce436","line":437,"updated":"2016-07-12 16:21:35.000000000","message":"nit: maybe we should explicitly skip this test case instead with a comment, that cells do not support host aggregates?","commit_id":"ae40485f68c8515f086958a21362bb27162be723"}]}
