)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2a166731144aa9b15ea348598f65a13211b85fed","unresolved":false,"context_lines":[{"line_number":12,"context_line":"layer API is_up() to get details about service live-ness. The proposal"},{"line_number":13,"context_line":"is keep service data in nova database nova.services table and fetch"},{"line_number":14,"context_line":"the live-ness information from the configured servicegroup(SG) driver."},{"line_number":15,"context_line":"Liveness will be a combination of service live-ness and RPC live-ness,"},{"line_number":16,"context_line":"where the later will be computed based on information in nova.services."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I8d9aaa02b91418b64d3d8a168095d274d2e66f8b"},{"line_number":19,"context_line":"Implements: blueprint servicegroup-api-control-plane"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"da6ed579_f00a2d78","line":16,"range":{"start_line":15,"start_character":0,"end_line":16,"end_character":71},"updated":"2016-01-15 14:46:35.000000000","message":"If we want that, lets keep that as a separate change.\n\nThis change needs to focus on all service group calls going to the object layer, and the object layers new is_up() call calling through to the service group api.\n\nWe should probably remove all other methods from the service group driver, so it only supports is_up(), for the moment:\nhttps://github.com/openstack/nova/blob/master/nova/servicegroup/api.py#L73\nThat or we should also call join during service_group create call, and change the DB driver to a no-op?","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"}],"nova/api/openstack/compute/legacy_v2/contrib/services.py":[{"author":{"_account_id":19912,"name":"Xuanzhou Perry Dong","email":"oss_xzdong@163.com","username":"oss_xzdong"},"change_message_id":"ff4f9344f66e3d620b9f5e42742c757aa3ef9449","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        services \u003d self.host_api.service_get_all("},{"line_number":43,"context_line":"            context, set_zones\u003dTrue)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        print(\"In _get_services services : %s\", services)"},{"line_number":46,"context_line":"        host \u003d \u0027\u0027"},{"line_number":47,"context_line":"        if \u0027host\u0027 in req.GET:"},{"line_number":48,"context_line":"            host \u003d req.GET[\u0027host\u0027]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a68dd71_5edc1e46","line":45,"range":{"start_line":45,"start_character":0,"end_line":45,"end_character":57},"updated":"2016-01-27 02:39:56.000000000","message":"Remove debug code before review.","commit_id":"9e043e7f3c38fb170f55214903bc08ca1bb732f8"},{"author":{"_account_id":19912,"name":"Xuanzhou Perry Dong","email":"oss_xzdong@163.com","username":"oss_xzdong"},"change_message_id":"ff4f9344f66e3d620b9f5e42742c757aa3ef9449","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    def _get_services_list(self, req, detailed):"},{"line_number":77,"context_line":"        services \u003d self._get_services(req)"},{"line_number":78,"context_line":"        svcs \u003d []"},{"line_number":79,"context_line":"        print(\"in _get_services_list services: %s\", services)"},{"line_number":80,"context_line":"        for svc in services:"},{"line_number":81,"context_line":"            svcs.append(self._get_service_detail(svc, detailed))"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a68dd71_3ee4ca0b","line":79,"range":{"start_line":79,"start_character":0,"end_line":79,"end_character":61},"updated":"2016-01-27 02:39:56.000000000","message":"Remove debug code before review.","commit_id":"9e043e7f3c38fb170f55214903bc08ca1bb732f8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"521c0bcfdc89557d705fda85d15b97f7da883ae0","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def _get_services_list(self, req, detailed):"},{"line_number":76,"context_line":"        services \u003d self._get_services(req)"},{"line_number":77,"context_line":"        svcs \u003d []"},{"line_number":78,"context_line":"        print(\"in _get_services_list services: %s\", services)"},{"line_number":79,"context_line":"        for svc in services:"},{"line_number":80,"context_line":"            svcs.append(self._get_service_detail(svc, detailed))"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5a5ae5dd_e3f72157","line":78,"updated":"2016-02-05 09:51:00.000000000","message":"please remove the print statements from the code","commit_id":"6a4124a30cc8963780c561d22c990bf867561059"}],"nova/objects/service.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"a53d1d6827ad650bf8f70dea057617729bce95c7","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def service_is_up(self):"},{"line_number":205,"context_line":"        servicegroup_api \u003d servicegroup.API()"},{"line_number":206,"context_line":"        last_heartbeat \u003d (self.fields.get(\u0027last_seen_up\u0027) or"},{"line_number":207,"context_line":"                          self.fields.get(\u0027updated_at\u0027) or"},{"line_number":208,"context_line":"                          self.fields.get(\u0027created_at\u0027))"},{"line_number":209,"context_line":"        self.is_up \u003d ((last_heartbeat \u003c 120) or"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a2ca52d_e88e25cf","line":206,"updated":"2015-10-16 00:32:43.000000000","message":"Can all these be none?\n\nMaybe do something like:\n\n\n    beats \u003d [\n        self.fields.get(\u0027last_seen_up\u0027),\n        self.fields.get(\u0027updated_at\u0027),\n        self.fields.get(\u0027created_at\u0027),\n        sys.maxint,\n    ]\n    last_heartbeat \u003d min(b for b in beats if b is not None)\n\nThen if all are none, this is sys.maxint, or if not then the min last beat is chosen.","commit_id":"b3c9c25d9f597685d205b57589f693e06a91ea63"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"60d65f1f538f3b27f8c667198bffe4fd59969bb6","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                          self.fields.get(\u0027updated_at\u0027) or"},{"line_number":208,"context_line":"                          self.fields.get(\u0027created_at\u0027))"},{"line_number":209,"context_line":"        self.is_up \u003d ((last_heartbeat \u003c 120) or"},{"line_number":210,"context_line":"                      (servicegroup_api.service_is_up(self)))"},{"line_number":211,"context_line":"        return self.is_up"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    @base.remotable_classmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a2ca52d_28b09d89","line":210,"updated":"2015-10-16 00:33:11.000000000","message":"Use some config to get the value 120 here?","commit_id":"b3c9c25d9f597685d205b57589f693e06a91ea63"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"260b167b4312fb759b22f221bec5d8256f4a088c","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        self.compute_node \u003d compute_nodes[0]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @classmethod"},{"line_number":208,"context_line":"    def service_is_up(cls, service):"},{"line_number":209,"context_line":"        servicegroup_api \u003d servicegroup.API()"},{"line_number":210,"context_line":"        last_heartbeat \u003d (service.get(\u0027created_at\u0027) or"},{"line_number":211,"context_line":"                          service.get(\u0027updated_at\u0027))"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_1817fe48","line":208,"updated":"2016-01-15 07:47:20.000000000","message":"Based on the signature it feels like this shall not be a class method but a normal object method.","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2a166731144aa9b15ea348598f65a13211b85fed","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        self.compute_node \u003d compute_nodes[0]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @classmethod"},{"line_number":208,"context_line":"    def service_is_up(cls, service):"},{"line_number":209,"context_line":"        servicegroup_api \u003d servicegroup.API()"},{"line_number":210,"context_line":"        last_heartbeat \u003d (service.get(\u0027created_at\u0027) or"},{"line_number":211,"context_line":"                          service.get(\u0027updated_at\u0027))"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_3002050b","line":208,"in_reply_to":"da6ed579_1817fe48","updated":"2016-01-15 14:46:35.000000000","message":"+1\n\nI think something like this would be more normal:\n\n  def is_up(self):\n\nSo the callers just do:\n\n  service.is_up()\n\nAgreed it should be a function rather than a property or attribute, as its an active call.","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":10263,"name":"Vilobh Meshram","email":"vilobhmm@yahoo-inc.com","username":"vilobhmm"},"change_message_id":"338bc1935f508d6d7be4c4d6194bef3851e4a740","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        self.compute_node \u003d compute_nodes[0]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @classmethod"},{"line_number":208,"context_line":"    def service_is_up(cls, service):"},{"line_number":209,"context_line":"        servicegroup_api \u003d servicegroup.API()"},{"line_number":210,"context_line":"        last_heartbeat \u003d (service.get(\u0027created_at\u0027) or"},{"line_number":211,"context_line":"                          service.get(\u0027updated_at\u0027))"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_beb9cd7b","line":208,"in_reply_to":"da6ed579_1817fe48","updated":"2016-01-15 23:01:18.000000000","message":"Why do you think it should be a normal object method vs class method ? Doing so everywhere in nova code will need to make sure that the service is an object whereas somewhere it can even be a dict.","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"39e79b8bb26fcc2efe9cbc35add7b73dcbb2adf5","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        self.compute_node \u003d compute_nodes[0]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @classmethod"},{"line_number":208,"context_line":"    def service_is_up(cls, service):"},{"line_number":209,"context_line":"        servicegroup_api \u003d servicegroup.API()"},{"line_number":210,"context_line":"        last_heartbeat \u003d (service.get(\u0027created_at\u0027) or"},{"line_number":211,"context_line":"                          service.get(\u0027updated_at\u0027))"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_00cdd8b6","line":208,"in_reply_to":"da6ed579_beb9cd7b","updated":"2016-01-18 13:33:25.000000000","message":"Is the HostState the only place where we have a dict instead of a Service object? It feels that it is not hard to change the host_manager to pass a Service object instead as it already has the necessary information see here https://github.com/openstack/nova/blob/master/nova/scheduler/host_manager.py#L545","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"260b167b4312fb759b22f221bec5d8256f4a088c","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    @classmethod"},{"line_number":208,"context_line":"    def service_is_up(cls, service):"},{"line_number":209,"context_line":"        servicegroup_api \u003d servicegroup.API()"},{"line_number":210,"context_line":"        last_heartbeat \u003d (service.get(\u0027created_at\u0027) or"},{"line_number":211,"context_line":"                          service.get(\u0027updated_at\u0027))"},{"line_number":212,"context_line":"        last_heartbeat \u003d last_heartbeat.replace(tzinfo\u003dNone)"},{"line_number":213,"context_line":"        last_heartbeat \u003d timeutils.delta_seconds(last_heartbeat,"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_24e65ee8","line":210,"updated":"2016-01-15 07:47:20.000000000","message":"Isn\u0027t it the last_seen_up column indicate the time of the last check in of the service?\n\nAlso I guess we shall assume / require the the passed in \u0027service\u0027 parameter is an object, so instead of using the dict get, you can use object field access.","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"260b167b4312fb759b22f221bec5d8256f4a088c","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        last_heartbeat \u003d last_heartbeat.replace(tzinfo\u003dNone)"},{"line_number":213,"context_line":"        last_heartbeat \u003d timeutils.delta_seconds(last_heartbeat,"},{"line_number":214,"context_line":"                                                 timeutils.utcnow())"},{"line_number":215,"context_line":"        is_up \u003d ((last_heartbeat \u003c 120) or"},{"line_number":216,"context_line":"                 (servicegroup_api.service_is_up(service)))"},{"line_number":217,"context_line":"        return is_up"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_648bf61f","line":215,"range":{"start_line":215,"start_character":35,"end_line":215,"end_character":38},"updated":"2016-01-15 07:47:20.000000000","message":"Shouldn\u0027t it be CONF.service_down_time ?","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2a166731144aa9b15ea348598f65a13211b85fed","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        last_heartbeat \u003d last_heartbeat.replace(tzinfo\u003dNone)"},{"line_number":213,"context_line":"        last_heartbeat \u003d timeutils.delta_seconds(last_heartbeat,"},{"line_number":214,"context_line":"                                                 timeutils.utcnow())"},{"line_number":215,"context_line":"        is_up \u003d ((last_heartbeat \u003c 120) or"},{"line_number":216,"context_line":"                 (servicegroup_api.service_is_up(service)))"},{"line_number":217,"context_line":"        return is_up"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_b0235555","line":215,"range":{"start_line":215,"start_character":40,"end_line":215,"end_character":42},"updated":"2016-01-15 14:46:35.000000000","message":"This should be \"and\" not \"or\", if we want to do this.\n\nI think that, because the idea of using zookeeper would be to detect a service id down sooner than the heartbeat would detect it. So this doesn\u0027t work really.\n\nNow if the tooz driver decides to include the DB down into that driver, thats cool, but lets leave that in each driver, at least for now?","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2a166731144aa9b15ea348598f65a13211b85fed","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        last_heartbeat \u003d last_heartbeat.replace(tzinfo\u003dNone)"},{"line_number":213,"context_line":"        last_heartbeat \u003d timeutils.delta_seconds(last_heartbeat,"},{"line_number":214,"context_line":"                                                 timeutils.utcnow())"},{"line_number":215,"context_line":"        is_up \u003d ((last_heartbeat \u003c 120) or"},{"line_number":216,"context_line":"                 (servicegroup_api.service_is_up(service)))"},{"line_number":217,"context_line":"        return is_up"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_f07a2d76","line":215,"range":{"start_line":215,"start_character":35,"end_line":215,"end_character":38},"in_reply_to":"da6ed579_648bf61f","updated":"2016-01-15 14:46:35.000000000","message":"+1 on the config value comments.\n\nFeels like all this logic should stay being used from here:\nhttps://github.com/openstack/nova/blob/master/nova/servicegroup/drivers/db.py#L63\n\nI think its probably up to each driver if they also care about the DB state.","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":10263,"name":"Vilobh Meshram","email":"vilobhmm@yahoo-inc.com","username":"vilobhmm"},"change_message_id":"338bc1935f508d6d7be4c4d6194bef3851e4a740","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        last_heartbeat \u003d last_heartbeat.replace(tzinfo\u003dNone)"},{"line_number":213,"context_line":"        last_heartbeat \u003d timeutils.delta_seconds(last_heartbeat,"},{"line_number":214,"context_line":"                                                 timeutils.utcnow())"},{"line_number":215,"context_line":"        is_up \u003d ((last_heartbeat \u003c 120) or"},{"line_number":216,"context_line":"                 (servicegroup_api.service_is_up(service)))"},{"line_number":217,"context_line":"        return is_up"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_8f58598c","line":215,"range":{"start_line":215,"start_character":40,"end_line":215,"end_character":42},"in_reply_to":"da6ed579_b0235555","updated":"2016-01-15 23:01:18.000000000","message":"Done","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":10263,"name":"Vilobh Meshram","email":"vilobhmm@yahoo-inc.com","username":"vilobhmm"},"change_message_id":"338bc1935f508d6d7be4c4d6194bef3851e4a740","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        last_heartbeat \u003d last_heartbeat.replace(tzinfo\u003dNone)"},{"line_number":213,"context_line":"        last_heartbeat \u003d timeutils.delta_seconds(last_heartbeat,"},{"line_number":214,"context_line":"                                                 timeutils.utcnow())"},{"line_number":215,"context_line":"        is_up \u003d ((last_heartbeat \u003c 120) or"},{"line_number":216,"context_line":"                 (servicegroup_api.service_is_up(service)))"},{"line_number":217,"context_line":"        return is_up"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_4f53416d","line":215,"range":{"start_line":215,"start_character":35,"end_line":215,"end_character":38},"in_reply_to":"da6ed579_f07a2d76","updated":"2016-01-15 23:01:18.000000000","message":"Done","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2a166731144aa9b15ea348598f65a13211b85fed","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                                                 timeutils.utcnow())"},{"line_number":215,"context_line":"        is_up \u003d ((last_heartbeat \u003c 120) or"},{"line_number":216,"context_line":"                 (servicegroup_api.service_is_up(service)))"},{"line_number":217,"context_line":"        return is_up"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    @base.remotable_classmethod"},{"line_number":220,"context_line":"    def get_by_id(cls, context, service_id):"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_4bd6e84f","line":217,"updated":"2016-01-15 14:46:35.000000000","message":"Where are the unit test for this new method?","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"521c0bcfdc89557d705fda85d15b97f7da883ae0","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        \"\"\""},{"line_number":217,"context_line":"        last_heartbeat \u003d (self.last_seen_up or"},{"line_number":218,"context_line":"                          self.updated_at or"},{"line_number":219,"context_line":"                          self.created_at)"},{"line_number":220,"context_line":"        last_heartbeat \u003d last_heartbeat.replace(tzinfo\u003dNone)"},{"line_number":221,"context_line":"        last_heartbeat \u003d timeutils.delta_seconds(last_heartbeat,"},{"line_number":222,"context_line":"                                                 timeutils.utcnow())"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a5ae5dd_832d0d00","line":219,"range":{"start_line":218,"start_character":0,"end_line":219,"end_character":42},"updated":"2016-02-05 09:51:00.000000000","message":"Why do we need this fallback to update time and creation time of the service object?","commit_id":"6a4124a30cc8963780c561d22c990bf867561059"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"521c0bcfdc89557d705fda85d15b97f7da883ae0","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        last_heartbeat \u003d last_heartbeat.replace(tzinfo\u003dNone)"},{"line_number":221,"context_line":"        last_heartbeat \u003d timeutils.delta_seconds(last_heartbeat,"},{"line_number":222,"context_line":"                                                 timeutils.utcnow())"},{"line_number":223,"context_line":"        is_up \u003d ((last_heartbeat \u003c 120) and"},{"line_number":224,"context_line":"                 (self.servicegroup_api.service_is_up(self)))"},{"line_number":225,"context_line":"        return is_up"},{"line_number":226,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5a5ae5dd_23269915","line":223,"range":{"start_line":223,"start_character":35,"end_line":223,"end_character":38},"updated":"2016-02-05 09:51:00.000000000","message":"Same comment as in patchset 7. I think this shall be the CONF.service_down_time","commit_id":"6a4124a30cc8963780c561d22c990bf867561059"}],"nova/scheduler/driver.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"260b167b4312fb759b22f221bec5d8256f4a088c","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \"\"\"Return the list of hosts that have a running service for topic.\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        services \u003d objects.ServiceList.get_by_topic(context, topic)"},{"line_number":49,"context_line":"        return [service[\u0027host\u0027]"},{"line_number":50,"context_line":"                for service in services if objects.Service.service_is_up("},{"line_number":51,"context_line":"                service)]"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_24e73ead","line":49,"updated":"2016-01-15 07:47:20.000000000","message":"why do you changed it do dict key access?","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2a166731144aa9b15ea348598f65a13211b85fed","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \"\"\"Return the list of hosts that have a running service for topic.\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        services \u003d objects.ServiceList.get_by_topic(context, topic)"},{"line_number":49,"context_line":"        return [service[\u0027host\u0027]"},{"line_number":50,"context_line":"                for service in services if objects.Service.service_is_up("},{"line_number":51,"context_line":"                service)]"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_cb3898d5","line":49,"in_reply_to":"da6ed579_24e73ead","updated":"2016-01-15 14:46:35.000000000","message":"+1 this seems like a step backwards for our current direction.","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":10263,"name":"Vilobh Meshram","email":"vilobhmm@yahoo-inc.com","username":"vilobhmm"},"change_message_id":"338bc1935f508d6d7be4c4d6194bef3851e4a740","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \"\"\"Return the list of hosts that have a running service for topic.\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        services \u003d objects.ServiceList.get_by_topic(context, topic)"},{"line_number":49,"context_line":"        return [service[\u0027host\u0027]"},{"line_number":50,"context_line":"                for service in services if objects.Service.service_is_up("},{"line_number":51,"context_line":"                service)]"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_2f8fedcd","line":49,"in_reply_to":"da6ed579_cb3898d5","updated":"2016-01-15 23:01:18.000000000","message":"Done","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"}],"nova/tests/functional/api_sample_tests/test_hypervisors.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"521c0bcfdc89557d705fda85d15b97f7da883ae0","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_config import cfg"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from nova.cells import utils as cells_utils"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a5ae5dd_8333cd13","line":17,"updated":"2016-02-05 09:51:00.000000000","message":"it seems like an unnecessary change","commit_id":"6a4124a30cc8963780c561d22c990bf867561059"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"521c0bcfdc89557d705fda85d15b97f7da883ae0","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        def fake_service_get_by_compute_host(self, context, host):"},{"line_number":144,"context_line":"            return cells_utils.ServiceProxy("},{"line_number":145,"context_line":"                objects.Service("},{"line_number":146,"context_line":"                    id\u003d1, host\u003d\u0027fake-mini\u0027, disabled\u003dFalse,"},{"line_number":147,"context_line":"                    disabled_reason\u003dNone),"},{"line_number":148,"context_line":"                \u0027cell1\u0027)"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5a5ae5dd_c32d45a9","line":146,"range":{"start_line":145,"start_character":0,"end_line":146,"end_character":59},"updated":"2016-02-05 09:51:00.000000000","message":"this seems like an unnecessary change","commit_id":"6a4124a30cc8963780c561d22c990bf867561059"}],"nova/tests/unit/api/openstack/compute/test_availability_zone.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"521c0bcfdc89557d705fda85d15b97f7da883ae0","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        expected \u003d [{\u0027zoneName\u0027: \u0027zone-1\u0027,"},{"line_number":148,"context_line":"                    \u0027zoneState\u0027: {\u0027available\u0027: True},"},{"line_number":149,"context_line":"                    \u0027hosts\u0027: {\u0027fake_host-1\u0027: {"},{"line_number":150,"context_line":"                        \u0027nova-compute\u0027: {\u0027active\u0027: True, \u0027available\u0027: False,"},{"line_number":151,"context_line":"                                         \u0027updated_at\u0027: timestamp}}}},"},{"line_number":152,"context_line":"                   {\u0027zoneName\u0027: \u0027internal\u0027,"},{"line_number":153,"context_line":"                    \u0027zoneState\u0027: {\u0027available\u0027: True},"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a5ae5dd_c3546400","line":150,"updated":"2016-02-05 09:51:00.000000000","message":"Why do you need to change this?","commit_id":"6a4124a30cc8963780c561d22c990bf867561059"}],"nova/tests/unit/api/openstack/compute/test_services.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"260b167b4312fb759b22f221bec5d8256f4a088c","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"fake_services_list \u003d ["},{"line_number":43,"context_line":"    dict(test_service.fake_service,"},{"line_number":44,"context_line":"         binary\u003du\u0027nova-scheduler\u0027,"},{"line_number":45,"context_line":"         host\u003d\u0027host1\u0027,"},{"line_number":46,"context_line":"         id\u003d1,"},{"line_number":47,"context_line":"         disabled\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_c47bc2bc","line":44,"range":{"start_line":44,"start_character":16,"end_line":44,"end_character":17},"updated":"2016-01-15 07:47:20.000000000","message":"Why do you needed to change every string here to unicode?","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2a166731144aa9b15ea348598f65a13211b85fed","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"fake_services_list \u003d ["},{"line_number":43,"context_line":"    dict(test_service.fake_service,"},{"line_number":44,"context_line":"         binary\u003du\u0027nova-scheduler\u0027,"},{"line_number":45,"context_line":"         host\u003d\u0027host1\u0027,"},{"line_number":46,"context_line":"         id\u003d1,"},{"line_number":47,"context_line":"         disabled\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_0ba7900b","line":44,"range":{"start_line":44,"start_character":16,"end_line":44,"end_character":17},"in_reply_to":"da6ed579_c47bc2bc","updated":"2016-01-15 14:46:35.000000000","message":"+1, that seems odd?","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"}],"nova/tests/unit/conductor/tasks/test_live_migrate.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"260b167b4312fb759b22f221bec5d8256f4a088c","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        objects.Service.get_by_compute_host("},{"line_number":150,"context_line":"            self.context, self.destination).AndReturn(\"service\")"},{"line_number":151,"context_line":"        objects.Service.service_is_up(\"service\").AndReturn(True)"},{"line_number":152,"context_line":"        hypervisor_details \u003d {"},{"line_number":153,"context_line":"            \"hypervisor_type\": \"a\","},{"line_number":154,"context_line":"            \"hypervisor_version\": 6.1,"},{"line_number":155,"context_line":"            \"free_ram_mb\": 513,"},{"line_number":156,"context_line":"            \"memory_mb\": 512,"},{"line_number":157,"context_line":"            \"ram_allocation_ratio\": 1.0,"},{"line_number":158,"context_line":"        }"},{"line_number":159,"context_line":"        hypervisor_obj \u003d objects.ComputeNode(context\u003d\u0027fake-context\u0027,"},{"line_number":160,"context_line":"                                             **hypervisor_details)"},{"line_number":161,"context_line":"        self.task._get_compute_info(self.destination)\\"},{"line_number":162,"context_line":"                .AndReturn(hypervisor_obj)"},{"line_number":163,"context_line":"        self.task._get_compute_info(self.instance_host)\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_443d92db","line":160,"range":{"start_line":152,"start_character":0,"end_line":160,"end_character":66},"updated":"2016-01-15 07:47:20.000000000","message":"this seems like an unnecessary change","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2a166731144aa9b15ea348598f65a13211b85fed","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        objects.Service.get_by_compute_host("},{"line_number":150,"context_line":"            self.context, self.destination).AndReturn(\"service\")"},{"line_number":151,"context_line":"        objects.Service.service_is_up(\"service\").AndReturn(True)"},{"line_number":152,"context_line":"        hypervisor_details \u003d {"},{"line_number":153,"context_line":"            \"hypervisor_type\": \"a\","},{"line_number":154,"context_line":"            \"hypervisor_version\": 6.1,"},{"line_number":155,"context_line":"            \"free_ram_mb\": 513,"},{"line_number":156,"context_line":"            \"memory_mb\": 512,"},{"line_number":157,"context_line":"            \"ram_allocation_ratio\": 1.0,"},{"line_number":158,"context_line":"        }"},{"line_number":159,"context_line":"        hypervisor_obj \u003d objects.ComputeNode(context\u003d\u0027fake-context\u0027,"},{"line_number":160,"context_line":"                                             **hypervisor_details)"},{"line_number":161,"context_line":"        self.task._get_compute_info(self.destination)\\"},{"line_number":162,"context_line":"                .AndReturn(hypervisor_obj)"},{"line_number":163,"context_line":"        self.task._get_compute_info(self.instance_host)\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_8b8aa062","line":160,"range":{"start_line":152,"start_character":0,"end_line":160,"end_character":66},"in_reply_to":"da6ed579_443d92db","updated":"2016-01-15 14:46:35.000000000","message":"+1","commit_id":"ad4def3d92993131c10bbdc083d3ee5ef7c17f23"}]}
